디렉토리 구조를 유지하면서 파일 확장자로 파일을 재귀 적으로 복사하는 방법은 무엇입니까?


71

Linux 명령 행 .txt에서 한 디렉토리 (및 그 서브 디렉토리)에서 다른 디렉토리 로 (매우 큰) 파일 세트를 복사하고 싶습니다 .

그대로 유지하려면 디렉토리 구조가 필요하고로 끝나는 파일을 제외하고 파일을 무시해야합니다 .txt.


2
질문에 cp를 넣고 태그로 사용하면 이러한 옵션에 묶여 있음을 의미합니까? 데이터 세트가 매우 크기 때문에 어떤 이유로 복사 프로세스가 중단 될 수 있다고 가정하고 다시 시작해야합니다. find / cp 접근 방식이 전송을 재개하고 누락 된 부분 만 복사 할 수 있을지 확실하지 않습니다. find / cp에 묶이지 않으면 rsync를 고려할 수 있습니다. --exclude 옵션을 사용하면 .txt 파일을 건너 뛸 수 있습니다.
vtest

공정한 통화-rsync가 더 나은 옵션 일 것입니다. find / cp에 묶이지 않았습니다. (어쨌든 그것들을 사용했습니다-rsync가 원격 컴퓨터에 설치되지 않았습니다. 라이브 웹 서버였습니다. 가능한 한 작은 공간을 남기고 싶었습니다)
청구되지 않은 수하물

답변:


95

findcpio 를 사용 하여이 작업을 수행 할 수 있습니다

cd /top/level/to/copy
find . -name '*.txt' | cpio -pdm /path/to/destdir

(-updm for overwrite destination content.)

왜 m? 파일 수정 날짜를 유지한다고 생각했습니다.
Mubashar

7
cd /source/path
find -type f -name \*.txt -exec install -D {} /dest/path/{} \;

당신은 놓치고 .후를 find. 또한 macOS 10.13.1에서도 다음과 같이 작동했습니다.find . -type f -name "*.txt" -exec install -v {} /dest/path/{} \;
grim

2

다른 접근법

find . -name '*.txt' -exec rsync -R {} path/to/dext \;


나는이 해결책을 좋아한다. 나는 find . -iname '*.txt' -exec rsync -Rptgon {} path/to/dext \;대소 문자를 구분하지 않고 일치시키고 보존 자 소유권과 권한을 유지했습니다.
MountainX

1

나를 위해 일한 가장 쉬운 방법 :

cp --parents -R jobs/**/*.xml ./backup/

한 가지 문제점은 "상위 경로"가 올바른지 전에 "원하는"디렉토리로 이동해야한다는 것입니다.

또한 bash에서 재귀 글로브를 활성화했는지 확인하십시오.

shopt -s globstar

1

당신은 처음으로 그것을 복사하는 방법에 대해

cp -r /old/folder /new/folder

그런 다음 새 폴더로 이동하여 실행하십시오.

find . -type f ! -iname "*.txt" -delete

아니면 그냥

cp -r /old/folder /new/folder && find . -type f ! -iname "*.txt" -delete

편집 : 좋아, 필터링하는 하나의 명령을 원합니다 (시스템에 cpio명령 이 없기 때문에 이것을 테스트하지 않았습니다 !). 여기 내가 찾은 곳이 있습니다 : http://www.gnu.org/software/findutils/manual/html_mono/find.html#Copying-A-Subset-of-Files

find . -name "*.txt" -print0 |
     cpio -pmd0 /dest-dir

제발 나는 아직 그것을 시도하지 않았기 때문에, 먼저 테스트합니다. 누군가가 확인하면 좋을 것입니다.


nods Cheers-이것은 작동하지만 .txt로 필터링하지 않고 몇 백만 개의 파일 (수백 GB로 나옴)을보고 있습니다. 필요하다면, 가능하다면 복사하는 동안 걸러
내고

1
-pmd0에서 '0'을 제거하면 편집 된 버전이 작동합니다.
청구되지 않은

0in을 유지하고 명령 끝에 -pmd0추가 -print0해야합니다 find(바로 직전 |).
G-Man

1

macOS에서 동일한 작업을 수행하려고했지만 옵션이 실제로 효과가 없었습니다. 내가 발견 할 때까지 ditto.

많은 .wav 파일을 복사해야했고 비디오 파일을 건너 뛰어야했습니다.

find . -type f -iname "*.wav" -ls -exec ditto {} /destination/folder/{} \;

  • find .-현재 폴더에서 찾기를 실행합니다. cd /source/folder시작하기 전에 확인하십시오

  • -type f -파일 만 찾도록 지정

  • -iname "*.wav" -대소 문자를 구분하지 않는 * .wav를 찾도록 지시합니다.
  • -ls-작업중인 파일이 표시됩니다. Otherwase는 아무것도 보여주지 않습니다.
  • -exec ditto {} /destination/folder/{} \; -동일한 디렉토리 트리를 사용하여 파일을 복사하고 작성하는 모든 작업을 수행합니다.

0

디렉토리로 이동하십시오.

find . -regex '<regexp_to_get_directories_and_files_you_want>' | xargs -i cp -r --parents {} path/to/destination

정규식을 관리하면 좀 더 간단하고 강력합니다.


-1

디렉토리로 이동하십시오.

cp '*.css' /path/to/destination

디렉토리의 각 폴더로 이동해야하지만 지금까지 본 대부분의 옵션보다 낫습니다.


이 방법은 재귀 적이 지 않으므로 큰 디렉토리의 경우 꽤 오랫동안이 작업을 수행 할 수 있습니다.
Iain Reid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.