루트 디렉터리 및 하위 디렉터리에서만 특정 파일을 재동기화합니다.

루트 디렉터리 및 하위 디렉터리에서만 특정 파일을 재동기화합니다.

내 디렉토리 구조는 다음과 같습니다.

/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, -0in 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-fromnull로 구분된 경로 이름 목록으로 해석합니다. "표준 입력 스트림에서 읽기", 즉 명령에서 읽기를 의미하려면 -with를 사용하세요 . 파일당 가능한 한 많은 메타데이터를 복사/동기화하려면 ( ) 옵션을 사용하고 , 읽기 경로 이름의 디렉터리 경로 부분을 삭제하려면 ( ) 옵션을 사용합니다.--files-fromfind--archive-a--no-relative--no-R

우리가 읽는 경로 이름은 루트 디렉토리에 상대적이기 때문에 소스 디렉토리가 사용 rsync됩니다 ./find

파이프라인은 한 번 실행되고 및 사이의 경로 이름을 rsync안전하게 전달합니다 . 이미 나열된 파일과 동일한 이름을 가진 다른 파일을 무시하면 이름 충돌을 해결할 수 있다는 점만 참고하면 됩니다 .findrsyncrsync


use rsync에서 직접 호출 할 수도 있지만 효율성을 위해 use 를 사용하여 디렉터리를 찾은 다음 각 디렉터리의 모든 파일 동기화를 호출할 수 있습니다.find-execfindrsync*.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.

관련 정보