programing

include 옵션을 사용하여 특정 파일 형식에서만 rsync 복사

newnotes 2023. 4. 20. 22:41
반응형

include 옵션을 사용하여 특정 파일 형식에서만 rsync 복사

다음 bash 스크립트를 사용하여 특정 확장자(이 경우 *.sh)의 파일만 복사하지만 모든 파일에 복사됩니다.뭐가 잘못됐나요?

시작 = 1달러~ = 2달러
rsync - zarv --sync=".sh" $ ~

생각합니다--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".

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

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

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

man 페이지에서 중요한 부분은 다음과 같습니다.

전송할 파일/디렉토리 목록이 작성되면 rsync는 전송할 각 이름을 포함/제외 패턴 목록과 대조하여 첫 번째 일치 패턴이 실행됩니다.제외 패턴일 경우 해당 파일은 건너뛰고 포함 패턴일 경우 해당 파일 이름은 건너뜁니다.일치하는 패턴이 발견되지 않으면 건너뜁니다.파일명은 건너뛰지 않습니다.

요약:

  • 일치하는 패턴이 없으면 파일이 복사됩니다!
  • 어느 하나의 패턴이 일치하면 알고리즘은 종료됩니다.

또한 슬래시로 끝나는 것은 일치하는 디렉토리입니다(예:find -type d할 수 있습니다).

이 답을 위에서 떼어내자.

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

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

하나 더 추가: 파일을 (재귀 없이) 1개의 dir에서만 확장자로 동기화해야 하는 경우 다음과 같은 구성을 사용해야 합니다.

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

점 하세요.--include--no-r이 구조에서는 작동하지 않습니다.

편집:

귀중한 코멘트를 주신 gbyte.co님 감사합니다!

편집:

-uzv깃발은 이 문제와 직접적으로 관련이 없지만, 저는 깃발을 주로 사용하기 때문에 깃발을 포함시켰습니다.

bash 스크립트를 합니다.~/.bash_aliases 및 .bash "bash "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

및 싶었지만로 할 수 .rsync --include-from=rsync-files

rsync 파일 사용 시:

my-dir/
my-file.txt

- /*

언급URL : https://stackoverflow.com/questions/11111562/rsync-copy-over-only-certain-types-of-files-using-include-option

반응형