rsync 예제가 많이 있지만 제 질문은 다음과 같습니다. 특정 파일 형식(예: .mp3)을 폴더에 복사할 수 있는 rsync 전용 명령줄이 있습니까? find 명령을 사용하지 않고! 그리고! 전혀! dest 폴더에 디렉터리 구조를 다시 만드시겠습니까? (이로 인해 거대한 디렉토리가 생성되더라도?)
답변1
rsync
디렉터리 계층 구조에서 단일 일반 디렉터리로 파일을 반복적으로 복사 할 수 없습니다 . 이것이 가장 간단한 방법입니다 find
. 다음을 사용하세요.
find source-dir -name '*.mp3' -type f -exec cp {} dest-dir/ \;
위의 코드는 source-dir
이름이 다음으로 끝나는 일반 파일을 찾아서 .mp3
복사합니다 dest-dir
(이름 충돌을 처리하지 않음).
GNU 도구를 사용하면 효율성을 높이고 cp
호출 수를 최소화할 수 있습니다.
find source-dir -name '*.mp3' -type f -exec cp -t dest-dir/ {} +
물론, rsync
대신 전화하는 것을 방해하는 것은 없습니다.cp
find source-dir -name '*.mp3' -type f -exec rsync -a {} dest-dir/ \;
또는 더 효과적으로,
find source-dir -name '*.mp3' -type f -exec sh -c 'rsync -a "$@" dest-dir/' sh {} +
수천 개 미만의 파일이 있다고 보장할 수 있고 **
파일 이름 글로빙 패턴을 지원하는 셸이 있는 경우( shopt -s globstar
그림 참조 bash
):
rsync -a --no-r source-dir/**/*.mp3 dest-dir/
그러나 이렇게 하면 경로 이름과 일치하는 파일 형식을 확인할 수 없으며 숨겨진 이름이 아닌 이름만 일치합니다. zsh
셸 에서는 source-dir/**/*.mp3(.D)
(숨겨져 있을 수도 있는) 일반 파일만 선택할 수 있습니다. 셸 에서는 bash
일치하는 경로 이름을 반복하고 test 를 사용하여 각 경로 이름을 테스트해야 합니다 -f
. 또한 dotglob
숨겨진 이름과 일치하도록 셸 옵션을 설정해야 합니다 .