[linux] 포함 옵션을 사용하여 특정 유형의 파일에만 rsync 복사

다음 bash 스크립트를 사용하여 특정 확장자 (이 경우 * .sh)의 파일 만 복사하지만 여전히 모든 파일을 복사합니다. 뭐가 문제 야?

부터 = $ 1
to = $ 2

rsync -zarv --include = "*. sh"$ from $ to



답변

나는 생각한다 --include, 그렇지 않으면 의해 제외 된 파일의 하위 집합을 포함하는 데 사용 --exclude하지 않고 파일 만 포함하여보다를. 즉, 포함 하지 않는 의미 포함 에 대해 생각해야합니다 .

대신 시도하십시오.

rsync -zarv  --include "*/" --exclude="*" --include="*.sh" "$from" "$to"

rsync 버전 3.0.6 이상의 경우 순서를 다음과 같이 수정해야합니다 (설명 참조).

rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"

-m플래그를 추가하면 대상에 빈 디렉터리 구조가 생성되지 않습니다. 버전 3.1.2에서 테스트되었습니다.

따라서 * .sh 파일 만 원하는 경우 모든 파일을 제외하고 --exclude="*"모든 디렉토리 --include="*/"를 포함하고 모든 * .sh 파일을 포함해야합니다 --include="*.sh".

매뉴얼 페이지패턴 규칙 포함 / 제외 섹션에서 좋은 예를 찾을 수 있습니다 .


답변

@chepner의 대답은 파일이 포함되어 있는지 여부에 관계없이 모든 하위 디렉토리를 복사합니다. 파일을 포함하지 않고 디렉토리 구조를 유지하는 하위 디렉토리를 제외해야하는 경우

rsync -zarv  --prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"


답변

한 가지 더 추가 : (재귀없이) 한 디렉토리에서만 확장명으로 파일을 동기화해야하는 경우 다음 과 같은 구성을 사용해야합니다.

rsync -auzv --include './' --include '*.ext' --exclude '*' /source/dir/ /destination/dir/

첫 번째의 점에주의하십시오 --include. --no-r이 구조에서는 작동하지 않습니다.

편집하다:

귀중한 의견을 주신 gbyte.co에게 감사드립니다!


답변

다음은 man 페이지의 중요한 부분입니다.

전송할 파일 / 디렉토리 목록이 빌드되면 rsync는 포함 / 제외 패턴 목록에 대해 전송할 각 이름을 차례로 확인하고 첫 번째 일치 패턴이 작동합니다. 제외 패턴이면 해당 파일은 다음과 같습니다. 건너 뛰었습니다. 포함 패턴이면 해당 파일 이름을 건너 뛰지 않습니다. 일치하는 패턴이 없으면 파일 이름을 건너 뛰지 않습니다.

요약:

  • 패턴과 일치하지 않으면 파일이 복사됩니다!
  • 패턴이 일치하면 알고리즘이 종료됩니다.

또한 슬래시로 끝나는 것은 디렉토리와 일치 find -type d합니다.

이 답변을 위에서 분리 해 봅시다.

rsync -zarv  --prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"
  1. 디렉토리를 건너 뛰지 마십시오
  2. .sh파일을 건너 뛰지 마십시오
  3. 모두 건너 뛰기
  4. (암묵적으로 아무것도 건너 뛰지 마십시오. 그러나 위의 규칙은 기본 규칙이 발생하지 않도록 방지합니다.)

마지막으로, --prune-empty-directories첫 번째 규칙은 모든 곳에 빈 디렉토리를 만들지 않습니다.


답변

누군가 이것을 찾으면… 특정 파일과 폴더 만 재 동기화하고 싶었고 다음 명령으로 관리했습니다. rsync --include-from=rsync-files

rsync 파일 사용 :

my-dir/
my-file.txt

- /*


답변

이 편리한 함수를 작성하고 bash 스크립트 또는 ~/.bash_aliases. bash를 사용하여 Linux에서 로컬로 동기화를 테스트하고 awk설치했습니다. 효과가있다

selrsync(){
# selective rsync to sync only certain filetypes;
# based on: https://stackoverflow.com/a/11111793/588867
# Example: selrsync 'tsv,csv' ./source ./target --dry-run
types="$1"; shift; #accepts comma separated list of types. Must be the first argument.
includes=$(echo $types| awk  -F',' \
    'BEGIN{OFS=" ";}
    {
    for (i = 1; i <= NF; i++ ) { if (length($i) > 0) $i="--include=*."$i; } print
    }')
restargs="$@"

echo Command: rsync -avz --prune-empty-dirs --include="*/" $includes --exclude="*" "$restargs"
eval rsync -avz --prune-empty-dirs --include="*/" "$includes" --exclude="*" $restargs
}

장점 :

더 많은 인수를 추가하고자 할 때 짧고 편리하고 확장 가능합니다 (예 🙂 --dry-run.

예:

selrsync 'tsv,csv' ./source ./target --dry-run


답변