rsync - 제외 지시문에 *와 **를 사용하는 것의 차이점은 무엇입니까?

rsync - 제외 지시문에 *와 **를 사용하는 것의 차이점은 무엇입니까?

나 이후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.

관련 정보