내 디렉토리 구조는 다음과 같습니다.
/books/a.epub
/books/sub/b.epub
/books/test/c.epub
다 찾고싶다루트 디렉터리(/books/) 및 하위 디렉터리(/books/)에 있는 .epub 파일/) rsync를 사용하여 *.epub 파일만 원격 디렉터리에 복사합니다.
지금까지 나는 다음을 시도했습니다.
rsync -av --include='*.epub' --include='*/' --exclude='*' /media/share/Books/ /home/user/docker/calibre/books/
하지만 디렉터리도 동기화하고 있습니다.
출력은 다음과 같아야 합니다.
/a.epub
/b.epub
/c.epub
답변1
당신이 그것을 가지고 있고 무료라면 find
, xargs
당신은 이것을 할 수 있습니다:
find . -type f -iname "*.epub" -print0 | xargs -0 -I {} rsync -aPEmivv "{}" "/destination/directory"
사용하고 싶지 않은 경우 xargs
:
find . -type f -iname "*.epub" -exec rsync -aPEmivv "{}" "/destination/directory" \;
(두 변종 모두 /books/
디렉터리에서 실행됩니다)
그러나 -a
원하는 옵션(재귀, 심볼릭 링크, 사전 권한, 보존 시간, 소유자 유지, 그룹 유지, 장치 파일 유지)을 결정합니다.rsync
-rlptgoD
파일 이름을 다른 프로그램으로 파이프할 때 파일 이름의 특수 문자로 인해 문제가 발생하지 않도록 널로 구분된 문자열을 사용하는 것이 좋습니다(널로 구분된 입력의 경우 -print0
스위치 in find
, -0
in xargs
및 in 사용).rsync
답변2
반복할 여러 수준이 있나요? 그렇지 않다면?
rsync -aP books/*/*.epub books/*.epub /home/user/movedbooks/.
답변3
이 rsync
유틸리티는 파일이나 입력 스트림에서 경로 이름을 읽을 수 있습니다. find
를 사용하여 복사하려는 파일을 찾을 수 있습니다 rsync
.
/media/share/Books
이름이 쉘 와일드카드 패턴과 일치하는 일반 파일을 디렉토리에서 반복적으로 검색한다고 가정합니다 *.epub
. 이러한 기준과 일치하는 발견된 파일은 /home/user/docker/calibre/books
소스 계층 구조에서 발견된 해당 디렉터리 구조를 생성하지 않고 단일 디렉터리에 복사되어야 합니다 .
find /media/share/Books -type f -name '*.epub' -print0 |
rsync --from0 --files-from=- \
--archive --no-relative \
/ /home/user/docker/calibre/books
위에서 사용한 방식은 find
비표준이지만 일반적으로 구현되는 -print0
조건자를 지원한다고 가정합니다. 그렇지 않은 경우 -print0
로 대체할 수 있습니다 -exec printf '%s\0' {} +
.
위에서 사용된 옵션을 참고하세요 rsync
. 이 --from0
옵션은 rsync
읽기 데이터 스트림을 --files-from
null로 구분된 경로 이름 목록으로 해석합니다. "표준 입력 스트림에서 읽기", 즉 명령에서 읽기를 의미하려면 -
with를 사용하세요 . 파일당 가능한 한 많은 메타데이터를 복사/동기화하려면 ( ) 옵션을 사용하고 , 읽기 경로 이름의 디렉터리 경로 부분을 삭제하려면 ( ) 옵션을 사용합니다.--files-from
find
--archive
-a
--no-relative
--no-R
우리가 읽는 경로 이름은 루트 디렉토리에 상대적이기 때문에 소스 디렉토리가 사용 rsync
됩니다 ./
find
파이프라인은 한 번 실행되고 및 사이의 경로 이름을 rsync
안전하게 전달합니다 . 이미 나열된 파일과 동일한 이름을 가진 다른 파일을 무시하면 이름 충돌을 해결할 수 있다는 점만 참고하면 됩니다 .find
rsync
rsync
use rsync
에서 직접 호출 할 수도 있지만 효율성을 위해 use 를 사용하여 디렉터리를 찾은 다음 각 디렉터리의 모든 파일 동기화를 호출할 수 있습니다.find
-exec
find
rsync
*.epub
find /media/share/Books -type d -exec sh -c '
for dirpath do
rsync --archive \
--include="*.epub" --exclude="*" \
"$dirpath/" /home/user/docker/calibre/books
done' sh {} +
여기서 수행하는 작업은 시도한 작업과 유사하지만 처리 디렉터리를 제외하여 재귀를 명시적으로 허용하지 않습니다. 재귀를 사용하는 대신 우리는 rsync
이를 find
.