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 -p
및 touch
서로 후 :
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