할 수 있는
rsync -a --include="*.[Jj][Pp][Gg]" --include="*.[Jj][Pp][Ee][Gg]" --include="*.[Jj][Ff][Ii][Ff]" --exclude="*" tmp/a/* tmp/b/
다음과 같이 단순화되었습니다.
rsync -a --include="*.[Jj][PpFf][EIi]?[GgFf]" --exclude="*" tmp/a/* tmp/b/
.jpg .JFIF .jpeg를 다음과 같이 일치시킵니다.
ls tmp/a/*.{J,j}{P,p,F,f}{I,i,E,e,}{G,g,F,f} 2>/dev/null
작동하는 샘플 테스트를 만들었지만 foo.jp.png와 일치할 위험 없이 포함된 이미지를 --include에 병합하고 싶습니다 --include="*.[Jj][Pp]*[Gg]"
(복제하고 싶지 않습니다.)
mkdir -p tmp/a; touch tmp/a/foo.jpeg; touch tmp/a/bar.jpg; rm tmp/b/*; rsync -a --include="*.[Jj][Pp][Gg]" --include="*.[Jj][Pp][Ee][Gg]" --include="*.[Jj][Ff][Ii][Ff]" --exclude="*" tmp/a/* tmp/b/ ; ls -la tmp/b
답변1
다른 도구를 사용하여 파일 목록을 찾은 다음 rsync로 파이프하는 것이 더 나을 것입니다. 예를 들어:
find /tmp/a -iregex '.*\(jpe?g\|jfif\)' |
rsync -nav --files-from=- / /tmp/b
대소문자 무시를 의미합니다 -iregex
. 정규식 패턴은 ^
시작과 끝에서 $
암시적인 의미를 갖습니다 . 기본 정규식 유형은 다음과 같습니다.이맥스이므로 백슬래시가 필요합니다.
-n
(아무것도 복사하지 않기 위해 rsync에 남겨 두었습니다). --files-from
묵시적 으로 -R
이는 전체 경로(예: )가 tmp/a/t.jpg
대상에 복사된다는 것을 의미하므로 조회에서 절대 경로를 사용하고 rsync로 사용합니다.~에서목차( /
). 이는 조회 및 rsync를 위해 제공해야 하는 시작 디렉터리를 이해할 때까지 테스트를 단순화하기 위한 것입니다.
예를 들어 tmp/a
접두사를 제거하려면 다음을 수행할 수 있습니다 (cd /tmp/a; find . ... ) | rsync ... /tmp/a /tmp/b
. find가 출력되고 t.jpg
, rsync가 에서 파일을 찾아 /tmp/a
에서 파일을 생성합니다.t.jpg
/tmp/b
답변2
@meuh의 답변이 마음에 듭니다. 이 답변은 이유를 설명합니다야옹의 대답수행 방법은 다음과 같습니다.0 또는 1성냥rsync
rsync
매뉴얼 페이지의 지침에 따르면 명령줄 INCLUDE/EXCLUDE PATTERN RULES
에서 rsync
0 또는 1 기능을 사용할 수 없다고 생각됩니다.
rsync
쉘 명령줄의 확장된 버전을 사용하는 것 같습니다.패턴 매칭("와일드카드")는 다음과 다릅니다.정규식성냥.
0개 또는 1개의 기능을 사용할 수 있습니다.확장된 패턴 일치일부 쉘( extglob
의 옵션 bash
)이 있지만 이에 대한 논의나 이와 유사한 내용은 없습니다.확장된 패턴 일치맨 페이지의 기능 rsync
.