파일 용 mkdir -p


24

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

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


내가 아는 바는 없지만 .. mkdir -p / path / to / make && touch / path / to / file ... 만하면된다. 그러면 새로운 디렉토리 구조에 빈 파일이 만들어져 필요에 따라 모두 생성된다.

1
와 그 결합 @Kansha dirnamebasename우리는 하나의 인자를하기 만합니다; 이익! :)

그래, 잘 했어

답변:


29

소스 파일이 주어진 경우 설치가이를 수행합니다 /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소스로 빈 파일 ( 예 :로 새로 만든 파일)을 제공 할 수도 있습니다 .


7

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

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

3

나는 종종 이런 종류의 상황에 부딪 쳤으므로 단순히 .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'

1
내 남자! - 내가 전화, 감사 touchp처럼mkdir -p
ecoologic

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

3
test필요하지 않습니다; mkdir -p디렉토리가 이미 존재하면 아무것도하지 않습니다. 오류를 반환하지 않습니다.
derobert

1
물론 이것은 디렉토리 만 생성합니다.
CVn

0

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

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

0

"가짜"가 가능합니다.

먼저 몇 가지 필요한 이론 :

롭 그리피스는 자격이 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

2
본질적으로 cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'UUOC가있는 것에 대한 모든 설명 이 있습니다. 그러면 while read루프가 더 의미가 있을 때 xargs로 서브 쉘을 쉘에 다시 넣습니다.
Steven Penny

1
필자는 * nix 명령에 대해 가장 잘 알고 있지는 않습니다. UUOC가 무엇인지조차 모르지만 이것이 어떻게 끔찍한 대답인지는 알 수 없습니다. 연구, 테스트를 거쳐 원래의 질문에 대한 해결책입니다. 건설적인 것입니다 (무례한 의견과는 달리). 내가 여기에 있어서는 무책임한 일을했다고 생각되면 그 이유를 더 자세히 설명하십시오 . 나는 물질이없는 의견이 많은 논쟁에 대해서는 관심이 없습니다.
razorbeard 2016 년

1
내 마지막 의견은 그것을 완벽하게 설명합니다. 귀하의 전체 답변은로 작성하는 것이 좋습니다 while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt. UUOC에 대해 10 초 인터넷 검색을 할 수 없다는 사실도 알려줍니다
Steven Penny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.