파일 용 mkdir -p

mkdir -p디렉토리를 생성합니다; 또한 필요에 따라 부모 디렉토리를 만듭니다.

파일에 대해 비슷한 명령이 존재합니까? 필요한 경우 파일과 상위 디렉토리를 작성합니까?



답변

소스 파일이 주어진 경우 설치가이를 수행합니다 /dev/null. 이 -D인수는 모든 상위 디렉토리를 작성한다고 말합니다.

anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c
-rwxr-xr-x 1 anthony anthony 0 Jan 30 10:31 /tmp/a/b/c

버그인지 아닌지 확실하지 않습니다. 맨 페이지에는 장치 파일에 대한 동작이 언급되어 있지 않습니다. mktemp소스로 빈 파일 ( 예 :로 새로 만든 파일)을 제공 할 수도 있습니다 .


답변

아니, 내가 아는 한. 하지만 당신은 항상 사용할 수 있습니다 mkdir -ptouch서로 후 :

f="/a/b/c.txt"
mkdir -p -- "${f%/*}" && touch -- "$f"

답변

나는 종종 이런 종류의 상황에 부딪 쳤으므로 단순히 .bashrc파일에 함수를 작성했습니다 . 이렇게 생겼어요

function create() {
    arg=$1
    num_of_dirs=$(grep -o "/" <<< $arg | wc -l)
    make_dirs=$(echo $arg | cut -d / -f1-$num_of_dirs)
    mkdir -p $make_dirs && touch $arg
}

따라서 존재하지 않는 디렉토리의 경로 안에 파일을 만들려면 말할 것입니다.

create what/is/it  # will create dirs 'what' and 'is', with file 'it' inside 'is'

답변

dir=$(dirname "$f")
test -d $dir || mkdir -p "$dir"

답변

변수를 별도로 설정하면 변수를 변경하고 기록에서 명령을 매우 쉽게 실행할 수 있지만 한 줄에 유지하면서 제안하려고했습니다.

B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"

답변

“가짜”가 가능합니다.

먼저 몇 가지 필요한 이론 :

롭 그리피스는 자격이 2007 년에 기사를 게시 쉽게 새로운 폴더를 많이 만들기 그가 사용하는 논의에있어서 Macworld.com에 xargs사용하여 디렉토리를 만들 수있는 파일 목록에서 읽을 명령을mkdir .

xargs에 전달 된 각 인수의 값을 포함하는 플래그 로 placeholder( {}) 를 참조 할 수 -I있습니다 xargs. 다음은 해당 플래그를 사용하거나 사용하지 않는 차이점입니다.

$ foo.txt bar.txt | xargs echo
$ => foo.txt bar.txt
$ foo.txt bar.txt | xargs -I {} echo {}
$ => foo.txt
$ => bar.txt

xargs또한 sh -c플래그를 사용하여 임의의 쉘 명령을 실행할 수 있습니다 .

foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'

개념 결합 :

우리는 이러한 개념을 결합 할 수 있습니다 mkdir -p대신 mkdir하고있는 개념 @ldx대답 이 생산 :

$ cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'

이 명령은 기본적으로 파일의 라인으로 구분 된 목록에있는 각 파일 이름을 매핑 파일의 일부가 떨어져 갈비와 디렉토리를 생성 mkdir -p한 후touch 해당 파일을 해당 디렉토리에 표시합니다.

위 명령에서 발생하는 작업에 대한 분석은 다음과 같습니다.

예를 들어 내 files.txt모습이 다음과 같다고 가정 해보십시오 .

deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
  • cat files.txt 생산 deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt
  • deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt 에 파이프 xargs
  • 우리가 사용했기 때문에 -I {}, xargs우리가 지금 그래서, 그것을 자신의 명령에 각 인수를 변환합니다 :
    • deeply/nested/foo/bar.txt
    • deeply/nested/baz/fiz.txt
  • 그런 다음 &&콤비 네이터를 사용하여 순차적으로 실행되는 3 개의 명령을 그룹화 하는 셸 명령을 실행합니다. 첫 번째 명령은 이전에 등록한 자리 표시자를 사용하여 파일을 환경 변수 (다음 파일 패스에서 재 사용됨)에 저장합니다. 있다:
    • f=deeply/nested/foo/bar.txt
    • f=deeply/nested/baz/fiz.txt
  • 이제 전달할 수있는 변수가 mkdir -p있지만 파일 이름을 잘라 내야합니다. 다음을 사용하여 충분히 간단합니다 '${f%/*}'.
    • mkdir -p deeply/nested/foo/
    • mkdir -p deeply/nested/baz/
  • 그리고 우리가 f할 때 변수 전체를 다시 참조하십시오 touch.
    • touch deeply/nested/foo/bar.txt
    • touch deeply/nested/baz/fiz.txt