다음 bash 스크립트를 사용하여 특정 확장자 (이 경우 * .sh)의 파일 만 복사하지만 여전히 모든 파일을 복사합니다. 뭐가 문제 야?
부터 = $ 1 to = $ 2 rsync -zarv --include = "*. sh"$ from $ to
rsync
합니까? 이것은 쉘 내부로 매우 잘 달성 될 수 있습니까?
다음 bash 스크립트를 사용하여 특정 확장자 (이 경우 * .sh)의 파일 만 복사하지만 여전히 모든 파일을 복사합니다. 뭐가 문제 야?
부터 = $ 1 to = $ 2 rsync -zarv --include = "*. sh"$ from $ to
rsync
합니까? 이것은 쉘 내부로 매우 잘 달성 될 수 있습니까?
답변:
나는 생각한다 --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"
.
rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"
.
--include=\*.sh
그 다음 --exclude=\*
)
@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에게 감사드립니다!
include
및 exclude
옵션을 사용하기 때문 입니다.이 외에도 첫 번째 일치 항목에서 중지됩니다. 따라서이 --exclude '*'
예제에서 처음에를 지정 하면 rsync는 아무 작업도 수행하지 않습니다. 자세한 설명은 남자를 참조하십시오.
-- include './'
는 소스 디렉토리 경로의 모든 것을 포함합니까? 그런 다음 다음`--include '.ext'`는 이름이 지정된 소스 경로에 특정 파일을 포함 .ext
하고 제외는 아무것도 보내지 않는다고 말합니다 --exclude '*'
. 그 맞습니까?
--include '*.ext'
하지--include '.ext'
다음은 man 페이지의 중요한 부분입니다.
전송할 파일 / 디렉토리 목록이 빌드되면 rsync는 포함 / 제외 패턴 목록에 대해 전송할 각 이름을 차례로 확인하고 첫 번째 일치 패턴이 작동합니다. 제외 패턴이면 해당 파일은 다음과 같습니다. 건너 뛰었습니다. 포함 패턴이면 해당 파일 이름을 건너 뛰지 않습니다. 일치하는 패턴이 없으면 파일 이름을 건너 뛰지 않습니다.
요약:
또한 슬래시로 끝나는 것은 디렉토리와 일치 find -type d
합니다.
이 답변을 위에서 분리 해 봅시다.
rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
.sh
파일을 건너 뛰지 마십시오마지막으로, --prune-empty-directories
첫 번째 규칙은 모든 곳에 빈 디렉토리를 만들지 않습니다.
이 편리한 함수를 작성하고 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