cp를 사용하여 dem 등원으로 폴더를 재귀 적으로 복사하는 방법은 무엇입니까? 물건에 다시 한 번 생성 될 두

내가 사용할 때

cp -R inputFolder outputFolder

결과는 상황에 따라 다릅니다 .

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

이 끔찍 좀 설치 스크립트를 만들려고하기 때문에, 사용자가 실수로 두 번 실행하는 경우, 그 것이다 outputFolder모든 물건에 다시 한 번 생성 될 두 번째 실행에 처음 만들어 outputFolder/inputFolder.

  • 나는 항상 첫 번째 행동을 원합니다. 원본 옆에 형제로 복제본을 만듭니다.
  • cp휴대용 으로 사용하고 싶습니다 (예 : MINGW는 rsync배송 되지 않음 )
  • 확인 cp -R --parents했지만 디렉토리 트리까지의 경로를 다시 만듭니다 (복제본은 outputFolder아니지만 some/path/outputFolder)
  • --remove-destination또는 --update2가 아무것도 변경하지 않으면 여전히 내용이 복사됩니다.outputFolder/inputFolder

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

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



답변

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

cp -R inputFolder/. outputFolder

이것은 작동하는 것과 똑같은 방식으로 cp -R aaa/bbb ccc작동합니다. ccc존재하지 않으면 사본 bbb과 그 내용 으로 만들어집니다 . 그러나 ccc이미 존재 ccc/bbb하면 사본 bbb과 내용으로 만들어집니다.

거의 모든 경우에 bbb대해 귀하의 질문에 언급 한 바람직하지 않은 행동을 제공합니다. 그러나,이 특정 상황에서이 bbb그냥 ., 그래서 aaa/bbb정말 aaa/.차례로 정말이다, aaa그러나 다른 이름으로. 따라서이 두 가지 시나리오가 있습니다.

  1. ccc 존재하지 않는다:

    명령 cp -R aaa/. ccc수단 “을 만들 ccc및 내용 복사 aaa/.로를 ccc/., 즉 복사 aaaccc.

  2. ccc 존재한다 :

    명령 cp -R aaa/. ccc수단 “의 내용 복사 aaa/.로를 ccc/., 즉 복사 aaaccc.


답변

폴더를 복사하지 말고 내용 만 복사하십시오.

## 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에서 이름이 a로 시작하는 파일을 건너 뜁니다 .. 이를 피하려면 shopt -s dotglob위 명령을 실행 하기 전에 실행할 수 있습니다 .

모두 -p를위한mkdir-R에 대한cp 이 완벽하게 이식해야하므로 POSIX에 의해 정의됩니다.


답변

-T옵션을 사용해보십시오 cp. 이것은 GNU coreutils cp버전 8.22에 있습니다. 그 밖에는 휴대 할 수 없습니다.


답변

당신은 또한 사용할 수 있습니다 rsync:

rsync -uav inputFolder/ outputFolder/

(특히 첫 번째 슬래시 이후의 슬래시에 유의하십시오)


답변

내 의견으로는,보다 단순하고 휴대하기 쉬운 것은 없습니다 rm -rf outputFolder. 그래서 나는 항상 그것을 고수합니다. 귀하의 질문이 다르다는 것을 이해하지만 이것이 최선의 방법이라고 생각합니다.


답변

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

cp -R inputFolder -t outputFolder

이제 대상 폴더가 존재하지 않으면 오류가 발생합니다.

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

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

inputFolder별표를 사용하는 동안 쉘 globbing을 사용하는 동안주의해야하기 때문에 내용을 복사 하기가 조금 까다로워집니다.

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

이제 대상 폴더가 존재하지 않으면 오류가 발생합니다.

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

와 일하다 cp (GNU coreutils) 8.23