대상 디렉토리가 존재하지 않는 경우 대상 디렉토리를 작성하는 명령 (또는 아마도 cp 옵션)을 원합니다.
예:
cp -? file /path/to/copy/file/to/is/very/deep/there
답변
mkdir -p "$d" && cp file "$d"
(에 대한 해당 옵션이 없습니다 cp
).
답변
다음 둘 다에 해당되는 경우 :
- GNU 버전
cp
(예 : Mac 버전은 아님)을 사용하고 있으며 - 기존 디렉토리 구조에서 복사 중이며 다시 작성하면됩니다.
그런 다음의 --parents
플래그를 사용 하여이 작업을 수행 할 수 있습니다 cp
. [정보] 페이지에서 (볼에서 http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html#cp-invocation 또는 info cp
나 man cp
) :
--parents Form the name of each destination file by appending to the target directory a slash and the specified name of the source file. The last argument given to `cp' must be the name of an existing directory. For example, the command: cp --parents a/b/c existing_dir copies the file `a/b/c' to `existing_dir/a/b/c', creating any missing intermediate directories.
예:
/tmp $ mkdir foo
/tmp $ mkdir foo/foo
/tmp $ touch foo/foo/foo.txt
/tmp $ mkdir bar
/tmp $ cp --parents foo/foo/foo.txt bar
/tmp $ ls bar/foo/foo
foo.txt
답변
짧은 답변
에 복사하려면 다음 myfile.txt
을 /foo/bar/myfile.txt
사용하십시오.
mkdir -p /foo/bar && cp myfile.txt $_
어떻게 작동합니까?
여기에는 몇 가지 구성 요소가 있으므로 모든 구문을 단계별로 다룰 것입니다.
에서 mkdir 유틸리티는 POSIX 표준에 지정된대로 , 디렉토리를 만든다. -p
인수는 워드 프로세서 당 원인이됩니다 MKDIR 에
누락 된 중간 경로 이름 구성 요소 작성
호출 할 때 즉 mkdir -p /foo/bar
, MKDIR이 만들어집니다 /foo
및 /foo/bar
경우 /foo
않습니다 존재하지. (없이는 -p
대신 오류가 발생합니다.
&&
목록 연산자는에 설명 된대로 POSIX 표준 (또는 배쉬 설명서 원하는 경우), 효과가 cp myfile.txt $_
있는 경우에만 실행됩니다 mkdir -p /foo/bar
성공적으로 실행합니다. 이는 여러 가지 이유로 실패한 cp
경우 명령이 실행되지 않음을 의미합니다 .mkdir
마지막으로, $_
두 번째 인수로 전달 cp
하는 “특수 매개 변수”는 변수에 저장하지 않고도 긴 경로 (파일 경로와 같은)를 반복하지 않도록하는 데 유용합니다. 당 배쉬 설명서 , 그것은 :
이전 명령의 마지막 인수로 확장
이 경우에 /foo/bar
우리가 전달한 것 mkdir
입니다. 따라서 cp
명령이로 확장되어 새로 작성된 디렉토리에 cp myfile.txt /foo/bar
복사 myfile.txt
됩니다 /foo/bar
.
참고 $_
입니다 하지 POSIX 표준의 일부는 , 그래서 이론적으로 유닉스 변종이 구조를 지원하지 않는 쉘이있을 수 있습니다. 그러나, 나는 지원하지 않는 현대 쉘을 모른다 $_
. Bash, Dash 및 zsh는 모두 가능합니다.
마지막 참고 사항 :이 대답의 시작 부분에 입력 한 명령은 디렉토리 이름에 공백이 없다고 가정합니다. 공백이있는 이름을 처리하는 경우 다른 단어를 인용하도록 인용해야합니다 mkdir
또는에 대한 다른 인수로 취급되지 않습니다 cp
. 따라서 명령은 실제로 다음과 같습니다.
mkdir -p "/my directory/name with/spaces" && cp "my filename with spaces.txt" "$_"
답변
그런 오래된 질문이지만 대체 솔루션을 제안 할 수 있습니다.
install
프로그램을 사용 하여 파일을 복사하고 “즉시”대상 경로를 만들 수 있습니다.
install -D file /path/to/copy/file/to/is/very/deep/there/file
그러나 고려해야 할 몇 가지 측면이 있습니다.
- 대상 경로뿐만 아니라 대상 파일 이름도 지정 해야 합니다.
- 대상 파일 은 실행 가능합니다 (적어도 테스트에서 본 한)
-m
대상 파일에 대한 권한을 설정 하는 옵션을 추가하여 # 2를 쉽게 수정할 수 있습니다 (예 : -m 664
을 사용하여 rw-rw-r--
새 파일을 만드는 것처럼 권한이있는 대상 파일을 만듭니다 touch
).
그리고 여기에 내가 영감을 얻은 대답에 대한 부끄러운 연결이 있습니다 =)
답변
파일을 살 수있는 구멍을 파기 때문에 원하는 것을하는 “버리”사본이라고하는 쉘 함수 :
bury_copy() { mkdir -p `dirname $2` && cp "$1" "$2"; }
답변
이를 수행하는 한 가지 방법이 있습니다.
mkdir -p `dirname /path/to/copy/file/to/is/very/deep/there` \
&& cp -r file /path/to/copy/file/to/is/very/deep/there
dirname
대상 디렉토리 또는 파일의 부모를 제공합니다. mkdir -p`dirname …`은 cp -r을 호출 할 때 올바른 기본 디렉토리가 있는지 확인하는 해당 디렉토리를 작성합니다.
–parents에 비해이 방법의 장점은 대상 경로의 마지막 요소가 파일 이름 인 경우 작동한다는 것입니다.
그리고 그것은 OS X에서 작동합니다.
답변
install -D file -m 644 -t /path/to/copy/file/to/is/very/deep/there