쉘 리디렉션을 사용할 때 상위 디렉터리 생성

쉘 리디렉션을 사용할 때 상위 디렉터리 생성

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/topath/to/file

다른 경우에는 실패한 리디렉션이 취소됩니다 . 종료 상태를 보존할 수 있다는 장점 cmd도 있습니다 .cmd

모든 디렉토리 구성요소를 생성할 수 없거나 파일을 쓰기 위해 열 수 없는 경우 다음과 같은 문제가 발생할 수 있습니다.일부리디렉션 자체가 실패하더라도 디렉터리가 생성됩니다. 그런 다음 수동으로 정리해야 할 수도 있습니다.

관련 정보