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"
- 디렉터리를 건너뛰지 마십시오.
- 하나도 빼먹지 마
.sh파일 - 모두 건너뛰기
- (암시적으로 아무것도 건너뛰지 마십시오만, 위의 규칙은 기본 규칙이 발생하지 않도록 합니다.)
마지막으로,--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
'programing' 카테고리의 다른 글
| Azure Blob과 Page Blob의 차이점 (0) | 2023.04.20 |
|---|---|
| 입력 필드의 기본값 설정 (0) | 2023.04.20 |
| Url.Action 파라미터? (0) | 2023.04.20 |
| 명령줄에서 XLS를 CSV로 변환 (0) | 2023.04.20 |
| Mac OS X에서 C#/WPF 애플리케이션을 실행할 수 있습니까? (0) | 2023.04.20 |