나 이후rsync에 대한 기타 질문.
include/exclude 지시문이 패턴을 사용하여 소스 디렉터리의 파일 이름을 일치시켜 대상 디렉터리에 동기화할 파일을 결정하는 방법을 이해하려고 합니다.
디렉터리 구분 기호는 분명히 *
일치하지 않지만 **
하나(정확히 말하면 0개 이상)는 일치할 수 있습니다. 누군가 rsync 명령을 사용하여 이것이 무엇을 의미하는지 매우 명확하게 설명할 수 있습니까?
예를 들어:
이것은 내 소스 디렉터리 구조입니다.
../openwrt
../openwrt/afile.txt
../openwrt/BackupOfSettings
../openwrt/BackupOfSettings/file1.txt
../openwrt/BackupOfSettings/file2.txt
../openwrt/BackupOfSettings/file3.tar.gz
../openwrt/BackupOfPackages
../openwrt/BackupOfImages
../openwrt/BackupOfImages/anotherfile.txt
../openwrt/BackupOfImages/yetanotherfile.jpg
내 소스 및 대상 디렉터리:
openWrtPath="/mnt/usb/openwrt/"
ncpPath="/media/myCloudDrive/openwrt"
명령 예:
이 명령은 "BackupOfSettings" 폴더에 있는 tar.gz 확장자를 가진 파일만 동기화합니다.
rsync -vvritn --include='BackupOfSettings/' --include='BackupOfSettings/*.tar.gz' --exclude='*' $openWrtPath $ncpPath
위 명령은 소스 디렉터리의 각 하위 디렉터리를 반복적으로 반복하고 포함 및 제외 패턴을 각 파일에 적용합니다. 그러면 디렉터리 구분 기호를 어떻게 "확인"합니까?
누군가가 디렉터리 구분 기호 일치의 실패와 성공을 보여주는 위와 같은 시나리오를 제시할 수 있습니까 *
?**
건배.
답변1
BackupOfSettings
설정을 테스트하기 위해 일부 디렉터리와 파일을 추가해 보겠습니다 .
mkdir -p "$openWrtPath"/BackupOfSettings/sub1/sub2
touch "$openWrtPath"/BackupOfSettings/file1.tar.gz
touch "$openWrtPath"/BackupOfSettings/sub1/file2.tar.gz
touch "$openWrtPath"/BackupOfSettings/sub1/sub2/file3.tar.gz
또한 명령 sub1
에 하위 디렉터리를 추가합니다 .sub1/sub2
rsync -vvritn \
--include='BackupOfSettings/' \
--include='BackupOfSettings/sub1/' \
--include='BackupOfSettings/sub1/sub2/' \
--include='BackupOfSettings/*.tar.gz' \
--exclude='*' "$openWrtPath" "$ncpPath"
BackupOfSettings/file1.tar.gz
이렇게 하면 , BackupOfSettings/sub1/
및 가 동기화되지만 와 마찬가지로 BackupOfSettings/sub1/sub2/
하위 디렉터리 내의 파일은 동기화되지 않습니다 .*
/
BackupOfSettings/**.tar.gz
이제 다음을 포함해 보겠습니다 .
rsync -vvritn \
--include='BackupOfSettings/' \
--include='BackupOfSettings/sub1/' \
--include='BackupOfSettings/sub1/sub2/' \
--include='BackupOfSettings/**.tar.gz' \
--exclude='*' "$openWrtPath" "$ncpPath"
여기에는 세 개의 파일이 모두 포함됩니다 *.tar.gz
. 유사하지만 디렉터리 구분 기호 ( 및 )와도 **
일치합니다 .*
/
sub1/
sub1/sub2/
질문 제목에서와 같이 제외된 것으로 표시하는 것은 아래의 첫 번째 수준을 제외하면 모든 하위 디렉터리와 파일도 제외된다는 의미이므로(첫 번째 수준의 상위 디렉터리가 제외되기 때문에) **
약간 어렵습니다 . 사용해도 아무런 차이가 없습니다 .--exclude='*'
"$openWrtPath"
**
디렉터리 BackupOfSettings
와 해당 디렉터리 아래의 모든 하위 디렉터리를 포함하려면 위의 세 디렉터리 포함을 다음으로 바꿀 수 있습니다.
--include='BackupOfSettings/' \
--include='BackupOfSettings/**/' \
또는
--include='BackupOfSettings/***/' \
에서 man rsync
:
[...]
o a ’*’ matches any path component, but it stops at slashes.
o use ’**’ to match anything, including slashes.
[...]
o if the pattern contains a / (not counting a trailing /) or a "**", then it
is matched against the full pathname, including any leading directories.
If the pattern doesn’t contain a / or a "**", then it is matched only
against the final component of the filename. (Remember that the algorithm
is applied recursively so "full filename" can actually be any portion of a
path from the starting directory on down.)
o a trailing "dir_name/***" will match both the directory (as if "dir_name/"
had been specified) and everything in the directory (as if "dir_name/**"
had been specified). This behavior was added in version 2.6.7.
[...]
답변2
쉘은 이중 별표를 특수 와일드카드 문자로 해석할 수 있습니다. 또한보십시오 man bash
:
globstar
If set, the pattern ** used in a pathname expansion context will match
all files and zero or more directories and subdirectories.
If the pattern is followed by a /, only directories and subdirectories match.