Zsh에서는 다음 작업이 실패합니다.
$ echo hi > /tmp/this/path/does/not/exist/out.txt
zsh: no such file or directory: /tmp/this/path/does/not/exist/out.txt
분명히 문제는 >
누락된 상위 디렉토리를 생성할 수 없다는 것입니다. 나는 이 동작이 매우 짜증스럽다고 생각합니다. 디렉토리만 생성해야 하기 때문입니다. 어떻게 해야 하나요?
cp
및 같은 명령을 사용하여 옵션에 별칭을 mkdir
추가할 수 있습니다 . --parents
하지만 >
별칭은 명령이 아니기 때문에 사용할 수 없습니다. 어떡해?
이상적으로는 zsh에서 이 작업을 수행하고 싶지만 "다른 쉘 사용"을 대답으로 수락하겠습니다.
답변1
언제든지 다음을 생성할 수 있습니다.
create() { mkdir -p -- $1:h && cat > $1; }
그리고 다음을 사용하세요:
echo something | create path/to/some/file
심지어:
create() {
local dest
for dest do
mkdir -p -- $dest:h || return
done
cat > "$@"
}
다음을 수행할 수 있으려면:
echo hi | create some/file some/other/file
또 다른 방법:
makeparents() {
mkdir -p -- $1:h
print -r -- $1
}
그리고:
echo hi > "$(makeparents path/to/some/file)"
(개행 문자로 끝나는 파일 이름에는 적용되지 않음)
zsh의 동적으로 명명된 디렉터리 확장을 사용하여 이 작업을 수행할 수도 있습니다.
redir-parent() {
[[ $1 = n ]] && [[ $2 = p:* ]] || return
local file=${2#p:}
mkdir -p -- $file:h
reply=($file)
}
zsh_directory_name_functions+=(redir-parent)
그런 다음:
echo something > ~[p:path/to/some/file]
path/to/some
확장의 일부로 생성되는 위치입니다.
그럼에도 불구하고 이러한 모든 경우에 경로 디렉터리 구성 요소가 생성되면 현재 umask의 영향을 받는 기본 권한을 갖게 됩니다.
이 cmd | create path/to/file
버전 에서는 생성할 수 없거나 열 수 없는 cmd
경우에도 실행됩니다(결국 SIGPIPE에 의해 종료될 수 있음)./path/to
path/to/file
다른 경우에는 실패한 리디렉션이 취소됩니다 . 종료 상태를 보존할 수 있다는 장점 cmd
도 있습니다 .cmd
모든 디렉토리 구성요소를 생성할 수 없거나 파일을 쓰기 위해 열 수 없는 경우 다음과 같은 문제가 발생할 수 있습니다.일부리디렉션 자체가 실패하더라도 디렉터리가 생성됩니다. 그런 다음 수동으로 정리해야 할 수도 있습니다.