cp를 사용하여 멱 등성 방식으로 폴더를 재귀 적으로 복사하는 방법은 무엇입니까?
On 12월 1, 2020 by admin사용할 때
cp -R inputFolder outputFolder
결과는 컨텍스트 종속 :
-
outputFolder
가 존재하지 않는 경우 생성되고 복제 된 폴더 경로는outputFolder
가됩니다. -
outputFolder
가있는 경우 생성 된 복제본은 beoutputFolder/inputFolder
끔찍합니다. , 일부 설치 스크립트를 만들고 싶습니다. 사용자가 실수로 두 번 실행하면 처음에는 outputFolder
가 생성되고 두 번째 실행에서는 모든 항목이 생성됩니다. outputFolder/inputFolder
에서 다시 생성됩니다.
- 항상 첫 번째 동작을 원합니다. 클론 생성 원본 옆 (형제).
- 휴대용으로
cp
를 사용하고 싶습니다 (예 : MINGW는rsync
배송 됨) -
cp -R --parents
를 확인했지만 이렇게하면 디렉터리 트리까지 경로가 다시 생성됩니다 (따라서 클론은outputFolder
가 아니라some/path/outputFolder
) -
--remove-destination
입니다. 또는--update
2의 경우 아무것도 변경하지 않지만 여전히 항목은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
이지만 다른 이름입니다. 따라서 다음 두 가지 시나리오가 있습니다.
-
ccc
가 존재하지 않습니다.는”
ccc
를 만들고aaa/.
의 콘텐츠를ccc/.
, 즉aaa
를ccc
에 복사합니다. -
ccc
가 있습니다.cp -R aaa/. ccc
명령은”aaa/.
의 내용을ccc/.
, 즉aaa
를ccc
에 복사합니다.
댓글
- 어, 저 ' 저에게는 새로운 것이지만 작동하는 것 같습니다. 이 문서는 어디에서나 문서화 되었습니까?
- '
inputFolder
를 테스트했습니다.
실제로 Windows / Git Bash에서 작동합니다. (그러나 후행 /
에서는 작동하지 않습니다. 슬래시 뒤에 점도 필요합니다.)나는 그것이 ' 재미 있기 때문에 +1을 주었다. 그러나 그것은 ' 공개 코드에서 사용하기에는 너무 까다로울 것이다. 🙂
답변
폴더를 복사하지 말고 내용 만 복사하십시오.
## 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
의 경우
및 iv id의 경우 -R
= “a7c675a4a9″>
는 POSIX에 의해 정의되므로 완벽하게 이식 가능해야합니다.
댓글
- 참고 : 이렇게하면 '
.
로 시작하는 파일이 복사되지 않습니다. bash에서는이를 위해dotglob
를 사용할 수 있습니다. - 글로브 확장으로 인해 inputfolder의 디렉토리 항목 수가 많으면이 방법이 실패 할 수 있습니다. 최대 명령 줄 길이를 초과 할 수 있습니다.
답변
-T
옵션을 cp
로 설정합니다. 이것은 GNU coreutils cp
버전 8.22에 있습니다. 그 밖에서는 휴대가 불가능할 수 있습니다.
댓글
- 예, 이것이 제가 원했던 것 같습니다.
cp -T
(cp --no-target-directory
). unix.stackexchange.com/questions/94831/ … 불행히도 내 버전의cp
는 훨씬 오래되었습니다. - +1 오늘만 사용했습니다.
-u
는 게으르게 만들기 위해 추가 할 수있는 훌륭한 옵션입니다.
답변
rsync
를 사용할 수도 있습니다.
rsync -uav inputFolder/ outputFolder/
(특히 첫 번째 슬래시 뒤에 )
답변
iv id = “의 -t
옵션을 사용할 수 있습니다. a7c675a4a9 “>
명령 :
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
답변
제 생각에는 rm -rf outputFolder
보다 더 간단하고 이식성이 뛰어난 것은 없습니다. 그래서 저는 항상 그것을 고수합니다. 질문이 다르다는 점은 이해하지만 이것이 모범 사례라고 생각합니다.
댓글
- 특정 권한이나 소유권이 있으면 실패합니다. 유지해야하는 목표에. 또는 심볼릭 링크 인 경우.
- 질문은 디렉토리가 존재하지 않는 경우와 존재하는 경우 모두
cp
의 결과가 동일하기를 원합니다. 그래서 무슨 말을하는 거죠? - OP에서 제공하는
cp
명령은 권한을 유지하지 않습니다 ' (또는 타임 스탬프).
mv
에서 파일 모음을 하나의 일반 모음으로 이동하지 못하도록 방지하는 방법은 무엇입니까?rsync
를 사용하지 않겠습니까?cp
를 사용해야합니다. 두 개의tar
명령 사이를 파이프하는 것은 트리를 복사하는 신뢰할 수있는 좋은 방법입니다.rsync
가 배송되지 않은 MINGW에서 작동하기를 바랍니다.tar -C input -cf - . | tar -C output -xf -
작동합니다.-C
는 작업 디렉토리를 변경하지만 표준 옵션이 아니므로 '가 지원되지 않는 경우 두 개의 tar를 실행해야합니다. 시작할 올바른 작업 디렉토리, 예 :( cd input && tar -cf - . ) | ( cd output && tar -xf - )
그러나 ' Windows를 다루는 경우 저는 roaima '의 답변을 사용합니다. .