[linux] Linux : 대상 디렉토리가 존재하지 않으면 복사 및 작성

대상 디렉토리가 존재하지 않는 경우 대상 디렉토리를 작성하는 명령 (또는 아마도 cp 옵션)을 원합니다.

예:

cp -? file /path/to/copy/file/to/is/very/deep/there



답변

mkdir -p "$d" && cp file "$d"

(에 대한 해당 옵션이 없습니다 cp).


답변

다음 둘 다에 해당되는 경우 :

  1. GNU 버전 cp(예 : Mac 버전은 아님)을 사용하고 있으며
  2. 기존 디렉토리 구조에서 복사 중이며 다시 작성하면됩니다.

그런 다음의 --parents플래그를 사용 하여이 작업을 수행 할 수 있습니다 cp. [정보] 페이지에서 (볼에서 http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html#cp-invocation 또는 info cpman 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

그러나 고려해야 할 몇 가지 측면이 있습니다.

  1. 대상 경로뿐만 아니라 대상 파일 이름도 지정 해야 합니다.
  2. 대상 파일 은 실행 가능합니다 (적어도 테스트에서 본 한)

-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