rsync --include가 0개 또는 1개의 문자와 일치할 수 있습니까?

rsync --include가 0개 또는 1개의 문자와 일치할 수 있습니까?

할 수 있는

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에서 rsync0 또는 1 기능을 사용할 수 없다고 생각됩니다.

rsync쉘 명령줄의 확장된 버전을 사용하는 것 같습니다.패턴 매칭("와일드카드")는 다음과 다릅니다.정규식성냥.

0개 또는 1개의 기능을 사용할 수 있습니다.확장된 패턴 일치일부 쉘( extglob의 옵션 bash)이 있지만 이에 대한 논의나 이와 유사한 내용은 없습니다.확장된 패턴 일치맨 페이지의 기능 rsync.

관련 정보