Rsync 필터: 하나의 패턴만 복사

Rsync 필터: 하나의 패턴만 복사

LaTeX로 컴파일된 PDF만 모두 보관할 디렉토리를 만들려고 합니다. 저는 각 프로젝트를 별도의 폴더에 보관하고 모든 프로젝트를 LaTeX.

rsync -avn *.pdf ~/LaTeX/ ~/Output/

모든 PDF 파일을 찾아 ~/LaTeX/출력 폴더로 전송해야 합니다. 이것은 작동하지 않습니다. *.pdf" "과(와) 일치하는 항목을 찾을 수 없다고 표시됩니다 . 이 필터를 생략하면 명령은 LaTeX 아래의 모든 프로젝트 폴더에 있는 모든 파일을 나열합니다. 따라서 이것은 *.pdf 필터에 문제가 있는 것입니다. ~/내 홈 디렉토리의 전체 경로로 바꾸려고 시도했지만 효과가 없었습니다.

zsh를 사용하고 있습니다. 나는 bash에서 같은 일을 시도했고 심지어그리고모든 하위 디렉터리의 모든 파일에 대한 필터를 나열합니다. 무슨 일이 일어나고 있는 걸까요?

rsync가 PDF 전용 필터를 이해하지 못하는 이유는 무엇입니까?


좋아요 따라서 업데이트: 아니요, 노력 중입니다.

rsync -avn --include="*/" --include="*.pdf" LaTeX/ Output/

그러면 전체 파일 목록이 제공됩니다. 모든 것이 첫 번째 패턴에 맞는 것 같아요 ...

답변1

TL, 박사:

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Rsync는 소스를 대상으로 복사합니다. 소스로 전달되면 셸은 이를 *.pdf현재 디렉터리에 있는 확장자를 가진 파일 목록으로 확장합니다. .pdf디렉터리를 소스로 전달하지 않기 때문에 재귀 순회가 발생하지 않습니다.

따라서 실행해야 하지만 필터를 사용하여 rsync에 rsync -a ~/LaTeX/ ~/Output/파일만 복사하도록 지시해야 합니다. .pdfRsync의 필터링 규칙은 매뉴얼을 읽을 때 어려울 수 있지만 몇 가지 간단한 규칙만으로 많은 예제를 구축할 수 있습니다.

  • 포함 및 제외:

    • 이름이나 위치별로 파일을 제외하는 것은 쉽습니다 --exclude=*~( --exclude=/some/relative/location소스 매개변수 기준, 예: 제외 ~/LaTeX/some/relative/location).
    • 몇 개의 파일이나 위치만 일치시키려면 해당 항목을 포함하세요.이를 가리키는 모든 디렉토리를 포함하십시오.(예: 사용 --include=*/)을 사용한 다음 을 사용하여 나머지를 제외합니다 --exclude='*'. 이 때문입니다:
    • 디렉터리를 제외하면 해당 디렉터리 아래의 모든 항목이 제외됩니다. 제외된 파일은 전혀 고려되지 않습니다.
    • 디렉터리가 포함되어 있어도 해당 콘텐츠는 자동으로 포함되지 않습니다. 최신 버전에서는 --include='directory/***'이 작업이 수행됩니다.
    • 각 파일에 대해 첫 번째 일치 규칙이 적용됩니다(일치되지 않은 규칙도 포함됩니다).
  • 무늬:

    • 패턴이 포함되지 않으면 /디렉터리가 없는 파일 이름에 적용됩니다.
    • 패턴이 로 끝나는 경우 /디렉터리에만 적용됩니다.
    • 패턴이 로 시작하는 경우 /인수로 전달된 디렉터리의 전체 경로에 적용됩니다 rsync.
    • *단일 디렉터리 구성 요소의 모든 하위 문자열(즉, 일치하지 않음 /)은 **모든 경로 하위 문자열과 일치합니다.
  • 소스 매개변수가 로 끝나면 /해당 내용이 복사됩니다( rsync -r a/ b모든 항목에 대해 생성됨). 그렇지 않으면 디렉터리 자체가 복사(생성)됩니다.b/fooa/foorsync -r a bb/a


따라서 여기서는 을 포함하고 *.pdf, 이를 포함하는 디렉터리를 포함하고, 다른 모든 항목은 제외해야 합니다.

rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

이는 일치하는 파일이 포함되지 않은 디렉터리나 일치하는 파일이 포함된 하위 디렉터리를 포함하여 모든 디렉터리를 복사한다는 점에 유의하세요. 이 옵션을 사용하면 이 문제를 피할 수 있습니다 --prune-empty-dirs(명시적으로 일치하는 경우에도 디렉터리를 복사할 수 없으므로 보편적인 솔루션은 아니지만 드문 요구 사항입니다).

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

답변2

rsync -av --include="*/" --include="*.pdf" --exclude="*" ~/Latex/ ~/Output/ --dry-run

기본적으로 모든 항목이 포함되어 있으므로 모든 항목을 명시적으로 제외해야 합니다.뒤쪽에전송하려는 파일을 포함합니다. 실제로 파일을 전송하려면 --dry-run을 제거하세요.

다음으로 시작하는 경우:

--exclude '*' --include '*.pdf'

그리디 매칭은 모든 것을 한 번에 제외합니다.

시도하는 경우:

--include '*.pdf' --exclude '*' 

그러면 최상위 폴더에 있는 PDF 파일만 전송됩니다. "*"로 제외된 디렉터리는 따르지 않습니다.

답변3

이와 같은 패턴을 사용하면 *.pdf쉘은 패턴을 "확장"하여 현재 디렉토리에 있는 모든 항목으로 바꿉니다. 실행 중인 명령(이 경우 rsync)은 패턴을 사용하려고 한다는 사실을 인식하지 못합니다.

당신이 사용할 때다루기 힘든하지만 간단한 해결책이 있습니다. **패턴을 사용하여 폴더를 재귀적으로 일치시킬 수 있습니다. 이 시도:

rsync -avn ~/LaTeX/**/*.pdf ~/Output/

답변4

"패턴 규칙 포함/제외" 섹션에서맨페이지, 이를 수행하는 방법은 다음과 같습니다.

rsync -avn --include="*/" --include="*.pdf" ~/Latex/ ~/Output/

이것과 kbrd의 답변 사이의 주요 차이점은 --include="*/"이름이 무엇이든 관계없이 찾은 디렉토리를 계속 복사하도록 rsync에 지시하는 플래그입니다. 이는 하위 디렉터리를 복사하라는 지시가 없는 한 rsync가 하위 디렉터리로 반복되지 않기 때문에 필요합니다.

또한 따옴표로 인해 쉘이 현재 디렉토리를 기준으로 파일 이름으로 패턴을 확장하고 다음 중 하나를 수행하는 것을 방지할 수 있습니다.

  1. --include=foo.pdf성공하고 필터를 엉망으로 만듭니다. (누군가가 언제 ...라는 파일을 생성할지 실제로 알 수는 없지만 이러한 플래그 중간에 있을 가능성은 없습니다. )

  2. 실패하고 명령을 실행하는 대신 오류가 발생할 수 있습니다(zsh가 기본적으로 수행하는 것처럼).

관련 정보