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


110

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

부터 = $ 1
to = $ 2

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

4
엄밀히 말하면 관련이 없지만 $ from / $ to를 인용하는 것이 좋습니다. 그렇지 않으면 위치 인수 1/2에 공백이 포함 된 경우 예기치 않은 결과가 발생할 수 있습니다.
Kjetil Joergensen

명령이 작동하지 않는 이유를 이해 했습니까?
Charlie Parker

@CharlieParker :을 사용해야 rsync합니까? 이것은 쉘 내부로 매우 잘 달성 될 수 있습니까?
Inian

이 질문과 대답도 부족한 것은 한 가지 유형의 파일 만 보내려는 재귀 디렉토리가있는 경우 명령을 만드는 방법입니다. ... 그것은 단지 대상 디렉토리를 않는 것
찰리 파커 (Charlie Parker)에게

답변:


200

나는 생각한다 --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".

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


10
모든 하위 디렉토리를 가져 오지만 재 동기화하려는 하위 디렉토리에 .sh 파일이 있으면 --include = "* /"도 사용하고 싶을 가능성이 있습니다.
Kjetil Joergensen

50
나는 오래 전에 macports에서 얻은 rsync 버전 3.0.7에서 이것을 시도했지만이 포함 / 제외 순서로 작동하지 않았습니다. 이것은 나를 위해 일한 결과입니다 (OP에 맞게 조정 됨) rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to".
비쥬 우연히 찾아 낸 행운

3
rsync 3.0.9로 시도했지만 작동하지 않았습니다. Bijou가 맞습니다. 순서가 적절하지 않습니다 (먼저 --include=\*.sh그 다음 --exclude=\*)
TrueY

3
주 당신은 항상 편집을 클릭하고 :) 대답에 편집 제안 할 수 있음
Achal 데이브

2
포함 / 제외 주문에는 작동하지 않지만 Bijou Trouvaille에서 제안한 순서로 작동합니다
John Smith Optional

57

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

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

1
이것은 저에게 요구 사항이었습니다. "파일을 포함하지 않고 디렉토리 구조를 유지하는 하위 디렉토리를 제외해야하는 경우"+1
Juuso Ohtonen

1
--includes의 순서가 무엇인지 어떻게 알았는지 이해하지 못합니다.
Charlie Parker

1
한 가지 유형의 파일 만 보내려는 재귀 디렉토리가있는 경우 명령을 어떻게 작성합니까? 대상 디렉토리에 대해서만 수행하는 것 같습니다.
Charlie Parker

15

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

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

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

편집하다:

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


1
깃발의 순서가 무엇이어야하고 무엇을 포함해야하는지 어떻게 알았습니까?
Charlie Parker

1
@CharlieParker, rsync는 지정된 순서대로 includeexclude옵션을 사용하기 때문 입니다.이 외에도 첫 번째 일치 항목에서 중지됩니다. 따라서이 --exclude '*'예제에서 처음에를 지정 하면 rsync는 아무 작업도 수행하지 않습니다. 자세한 설명은 남자를 참조하십시오.
Serge Roussak

각 깃발이 무엇을하는지 설명해 주시겠습니까? 첫 번째 플래그 -- include './' 는 소스 디렉토리 경로의 모든 것을 포함합니까? 그런 다음 다음`--include '.ext'`는 이름이 지정된 소스 경로에 특정 파일을 포함 .ext하고 제외는 아무것도 보내지 않는다고 말합니다 --exclude '*'. 그 맞습니까?
Charlie Parker

1
한 가지 유형의 파일 만 보내려는 재귀 디렉토리가있는 경우 명령을 어떻게 작성합니까? 대상 디렉토리에 대해서만 수행하는 것 같습니다.
Charlie Parker

1
감사합니다! 필요 --include '*.ext'하지--include '.ext'
기가 바이트

13

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

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

요약:

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

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

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

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

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


무슨 일이 일어나고 있는지 설명 해주셔서 감사합니다. 이제 명령을 잊지 않을 가능성이 훨씬 더 큽니다.
MohamedEzz

3
''알고리즘이 종료된다 어떤 패턴 일치 "한 번 -이 키이며, 더 높은 등급의 답변 중 어느 것도 명확하고 여기처럼 선행으로 설명하지 물론이 중. 사람 페이지 somehwere에, 그리고 만약 내가 '신중하게 전체를 읽어 D, I'd've는 것을 알 그래도, 덕분에..
TheDudeAbides

0

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

rsync 파일 사용 :

my-dir/
my-file.txt

- /*

0

이 편리한 함수를 작성하고 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.