멱등성 방식으로 cp를 사용하여 폴더를 재귀적으로 복사하는 방법은 무엇입니까?

멱등성 방식으로 cp를 사용하여 폴더를 재귀적으로 복사하는 방법은 무엇입니까?

내가 사용할 때

cp -R inputFolder outputFolder

밝혀지다상황에 따라 다름:

  1. outputFolder존재하지 않는 경우 복제된 폴더 경로는 입니다 outputFolder.
  2. 존재하는 경우 outputFolder생성된 클론은outputFolder/inputFolder

이건 너무 무섭다, 일부 설치 스크립트를 생성하고 싶기 때문에 사용자가 실수로 두 번 실행하면 outputFolder처음으로 생성되고 두 번째 실행에서는 모든 것이 다시 생성됩니다 outputFolder/inputFolder.

  • 나는 항상 첫 번째 동작을 원합니다. 즉, 원본 객체 옆에 복제본(형제로서)을 생성하는 것입니다.
  • 내가 사용하고 싶은 것은 휴대용입니다. (예를 들어 MINGW는 배송 cp되지 않습니다 .)rsync
  • 확인했지만 cp -R --parents디렉터리 트리의 경로가 다시 생성됩니다(따라서 복제본은 그렇지 않습니다 outputFolder) some/path/outputFolder.
  • --remove-destination또는 --update사례 2에서 아무것도 변경되지 않으면 콘텐츠는 계속 복사됩니다.outputFolder/inputFolder

outputFolder먼저 존재 여부를 확인 하거나(폴더가 없으면...) 사용하지 않고 이 작업을 수행할 수 있는 방법이 있습니까 rm -rf outputFolder?

합의된 이식 가능한 UNIX 접근 방식은 무엇입니까?

답변1

대신 이것을 사용하십시오:

cp -R inputFolder/. outputFolder

이는 정확히 동일한 방식으로 작동합니다 cp -R aaa/bbb ccc. ccc존재하지 않는 경우 bbb해당 내용의 복사본 으로 생성되지만 ccc이미 존재하는 경우 해당 내용의 복사본 ccc/bbb으로 생성 됩니다.bbb

이와 같은 거의 모든 bbb상황에서 귀하의 질문에서 지적한 바람직하지 않은 동작이 발생합니다. 그러나 이 특별한 경우에는 " bbbjust"가 ." really just" aaa/bbb도 마찬가지입니다 aaa/.. 이는 "really just aaa"이지만 이름이 다릅니다. 따라서 다음과 같은 두 가지 상황이 있습니다.

  1. ccc존재하지 않는다:

    이 명령은 " 의 내용을 cp -R aaa/. ccc생성하고 복사한다는 의미입니다 .cccaaa/.ccc/.aaaccc

  2. ccc존재합니까?

    이 명령은 cp -R aaa/. ccc"콘텐츠를 aaa/.에 복사합니다 ccc/.. 즉, aaa에 복사합니다 ccc.

답변2

폴더를 복사하지 말고 내용만 복사하세요.

## Create the target directory. The -p suppresses error messages
## if the directory already exists
mkdir -p outputFolder

## Copy the contents recursively, this will not recreate the parent
cp -R inputfolder/* outputfolder/

이렇게 하면 스크립트를 처음 실행할 때 대상 디렉터리가 생성되고 두 번째로 실행할 때 문제가 발생하지 않도록 할 수 있습니다.

Chris Down 은 bash에서 이름을 ..shopt -s dotglob

둘 다-p~을 위한mkdir그리고-R~을 위한cpPOSIX에 의해 정의되므로 완전히 이식 가능해야 합니다.

답변3

-Tselect 를 시도해 보세요 cp. 이는 GNU coreutils cp버전 8.22에 존재하며 그 이상으로는 이식이 불가능할 수 있습니다.

답변4

-t명령 옵션을 사용할 수 있습니다 cp.

cp -R inputFolder -t outputFolder

이제 대상 폴더가 없으면 오류가 발생합니다.

cp: failed to access ‘outputFolder’: No such file or directory

위 명령은 inputFolder내용뿐만 아니라 내용도 함께 복사됩니다.

내용 만 복사하려는 경우에는 약간 까다롭습니다 inputFolder(별표*를 사용할 때 쉘 와일드카드를 사용할 때 주의해야 하기 때문입니다).

cp -R  -t outputFolder/ -- inputFolder/*

이제 대상 폴더가 없으면 오류가 발생합니다.

cp: failed to access ‘outputFolder’: No such file or directory

그리고cp (GNU coreutils) 8.23

관련 정보