디렉터리를 복사하지만 특정 이름을 가진 파일은 제외합니다.

디렉터리를 복사하지만 특정 이름을 가진 파일은 제외합니다.

작업 중인 클러스터에서는 rsync를 사용할 수 없으므로 cptar을 사용해야 합니다 find. 무시하면서 모든 파일과 하위 폴더 등을 포함하는 큰 디렉터리를 복사하고 싶습니다. 예를 들어 "file1", "file2" 또는 "file3"과 같은 이름을 가진 파일은 복사하지 않습니다.

나는 보았다이 문서는 SO에 관한 것입니다. 이를 통해 다음을 수행할 수 있습니다.포함하다특정 파일만. 나는 기본적으로 이것을 원하지만 나는 원한다들어오지 못하게 하다특정 파일.

나도 시도했다이 솔루션 하지만 거기에 제안된 명령을 사용하려고 하면 tar오류가 발생 tar: This does not look like a tar archive하고tar: Cowardly refusing to create an empty archive

나는 cp !(filename-to-ignore) new_dir/또한이 게시물하지만 하위 폴더는 복사되지 않습니다.

저는 bash의 초보자이므로 답변과 플래그 등의 기능을 설명해 주시면 정말 도움이 될 것입니다. 지금 시도해 보았는데 어렵지 않을 것이라고 생각합니다.

답변1

GNU 또는 libarchive 사용 tar:

(cd src && tar --exclude='file[123]' -cf - .) |
  (cd dst && tar -xpf -)

GNU는 tar파일 희소성을 유지하지 않으며 모든 확장 속성이 아니라 버전(또는 일부 운영 체제에 일부 패치가 있는 운영 체제)에 따라 달라집니다. (종종 이라고 함 libarchive)은 확장된 속성을 유지하며 추출 시 옵션을 사용하여 희소 파일을 생성할 수 있습니다.tarbsdtar-S

파이프를 통해 서로 연결된 두 개의 하위 쉘을 실행합니다. 첫 번째는 (현재) 디렉토리와 모든 내용을 tar재귀적으로 나타내는 스트림을 생성 .하지만 이름이 패턴과 일치하는 파일을 무시합니다 test[123](정규 표현식이 아닌 쉘 glob 패턴과 유사하며 여기에는 test{1, 2, 3 문자가 옵니다). } set)은 c서브쉘의 현재 작업 디렉토리를 일시 중단 d한 후 자체 작업 디렉토리()에서 스트림을 cd동적 으로 추출합니다 .tardst

GNU는 다음과 같이 내부적으로 이 작업을 수행하도록 선택할 tar수도 있습니다 .-Cchdir()Gilles는 귀하가 링크한 Q&A에 표시됩니다.(한 가지 빠진 것이 있었는데 지금 추가하고 오류를 설명했습니다.) .쉘을 사용하는 것보다 이점이 거의 없지만.cd

당신은 또한 볼 수 있습니다info -n exclude tar파일은 GNU를 사용하여 tar다양한 방법으로 제외할 수 있으며 더 일반적으로는info -n choosing tar파일이 생성하거나 추출하는 아카이브에 파일이 선택/포함되는 방식을 조정합니다.

관련 정보