rsync - 除外ディレクティブに*と**を使用することの違いは何ですか?

rsync - 除外ディレクティブに*と**を使用することの違いは何ですか?

私の後rsyncに関するその他の質問

include / excludeディレクティブがパターンを使用してソースディレクトリのファイル名を一致させて、ターゲットディレクトリに同期するファイルを決定する方法を理解しようとしています。

ディレクトリ区切り文字は明らかに*一致しませんが、**1つ(正確に言うと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"

これには3つのファイルがすべて含まれています*.tar.gz。同様ですが、ディレクトリ区切り記号(および)とも**一致します。*/sub1/sub1/sub2/

質問タイトルのように除外としてマークすることは、下の最初のレベルを除くとすべてのサブディレクトリとファイルも除外されることを意味するので(最初のレベルの親ディレクトリが除外されるため)、少し**難しいです。使用しても違いはありません。--exclude='*'"$openWrtPath"**


ディレクトリBackupOfSettingsとそのディレクトリの下のすべてのサブディレクトリを含めるには、上記の3つのディレクトリを次のものに置き換えます。

--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.
[...]

おすすめ記事