指定されたサブディレクトリの特定のファイル形式のみを再同期化

指定されたサブディレクトリの特定のファイル形式のみを再同期化

これは私のソースディレクトリ構造です。

../openwrt
../openwrt/BackupOfPackages
../openwrt/BackupOfSettings
../openwrt/BackupOfImages

rsyncを使用してターゲットディレクトリにミラーリングしたいと思います。 3つのサブディレクトリにあるファイルのみを再同期したい、拡張子を持つファイルのみを同期させたい:
.installedfrom thefolderfromthefolderfromthefolderBackupOfPackages
.img.gzBackupOfImages
.tar.gzBackupOfSettings

私のソースディレクトリには、basedir "openwrt"と各サブディレクトリにさまざまなファイルが混在しています。ただし、上記のように、特定のサブディレクトリの特定のファイル形式のみを同期したいと思います。

ここに画像の説明を入力してください。

これは私のrsyncコマンドです。

openWrtPath="/mnt/usb/openwrt/"  
ncpPath="/media/myCloudDrive/openwrt"

rsync -vvrit --include='/' --include='BackupOfSettings/' --include='BackupOfSettings/**.tar.gz' --include='BackupOfPackages/' --include='BackupOfPackages/**.installed' --include='BackupOfImages/' --include='BackupOfImages/**.img.gz' --exclude='/*' --delete --delete-excluded $openWrtPath ncp:$ncpPath

コマンドを実行すると、これが表示され非表示になる内容です。 basedirではopkg.installedと「新しいフォルダ」を正しく隠しますが、BackupOfSettings、BackupOfImagesなどから.installedなどのファイル形式は非表示になりません。

ここに画像の説明を入力してください。

Rsyncはソースからターゲットまでほぼすべてを同期しますか? ここに画像の説明を入力してください。

拡張のみをコピーするようにrsyncコマンドを変更するには:
.installedBackupOfPackagesフォルダへフォルダ
.img.gzBackupOfImagesフォルダ
.tar.gzへ:つまり、さまざまなサブディレクトリから宛先に転送しないファイル形式が、ソースシステムの対応するサブディレクトリにあっても正しく隠されます。BackupOfSettings

修正する

文を載せてから答えを見つけたと思い--exclude='/*'ます--exclude='*'。誰かがこれら2つの除外の違いを説明できますか?

スーダン'/*'"basedir(openwrt) のすべてのエントリを除外します。これは basedir のサブディレクトリには適用されません。"

ありがとうございます!

答え1

'/*'「basedir(openwrt)のすべてのエントリを除外します。これはbasedirのサブディレクトリには適用されません」という意味ですか?

はい、/これはトランスポートディレクトリのルートであり、/*そこにあるすべてのエントリ(ファイルとディレクトリ)と一致します。

コマンドの組み込みを次のように短縮できます。

rsync -ai \
  --include='BackupOf***/' \
  --include='BackupOfImages/**.img.gz' \
  --include='BackupOfSettings/**.tar.gz' \
  --include='BackupOfPackages/**.installed' \
  --exclude='*' \
  --delete --delete-excluded \
  "$openWrtPath" ncp:"$ncpPath"

これが意味するのは、(たとえば)--include='BackupOf***/'で始まるすべてのディレクトリとそのサブディレクトリを含むことです。これらのサブディレクトリを含める必要がない場合に変更し、ファイル拡張子を2から1に変更することもできます。BackupOfBackupOfImages/sub1/sub2/BackupOf*/***

-aインクルード-tおよびその他のオプションと一緒にアーカイブモードを使用し、両方の変数を参照しました。

答え2

/rsync は、考慮するパスの先頭に a を含めません。なぜ?デザイナーの選択。

しかし、別の問題があります。サブディレクトリにファイルを含めるには、インクルードに**を使用しました。ただし、サブディレクトリ自体は除外されます。埋め込みと除外を次のように変更してみてください。

--include='*/' --include='BackupOfSettings/**.tar.gz' --include='BackupOfPackages/**.installed' --include='BackupOfImages/**.img.gz' --exclude='*' --prune-empty-dirs

これはすべてのディレクトリを含み、目的のファイルだけを含み、他のファイルは含まず、空のディレクトリを削除することです。

別のオプションは、次のように書くことです。

--include='BackupOfSettings/' --include='BackupOfSettings/**/' --include='BackupOfSettings/**.tar.gz' --include='BackupOfPackages/' --include='BackupOfPackages/**/' --include='BackupOfPackages/**.installed' --include='BackupOfImages/' --include='BackupOfImages/**/' --include='BackupOfImages/**.img.gz' --exclude='*'

この場合、これには特定のディレクトリ、対応するサブディレクトリ、および必要なファイルが含まれます。検索を避けるソースツリーに他の多くのディレクトリがある場合は、このバリアントが必要です。

答え3

@Freddyの許可された回答の拡張

マイソースとターゲットディレクトリ:

openWrtPath="/mnt/usb/openwrt/"  
ncpPath="/media/myCloudDrive/openwrt"

私の目標は、ソースディレクトリのBackupOfSettingsというサブフォルダにある.tar.gz拡張子を持つファイルのみを同期することです。 BackupOfSettings サブフォルダー内のサブフォルダーも無視されます。

これは質問のコマンドの単純化されたバージョンです。クレジット取引ここそしてここrsync が特定のサブディレクトリの特定のファイル形式を同期する方法のガイドラインです。

rsync -vvritn --include='BackupOfSettings/' --include='BackupOfSettings/*.tar.gz' --exclude='*' $openWrtPath ncp:$ncpPath
  1. rsyncを使用してこれを達成するには、まず必要なファイルを含むサブディレクトリを含める必要があります。--include='BackupOfSettings/'
  2. その後、別のインクルードファイルで同じサブディレクトリに必要なファイルタイプと一致するパターンを定義する必要があります。--include='BackupOfSettings/*.tar.gz'
  3. 次に、次を使用して他のすべての項目を除外する必要があります。--exclude='*'ファイルの一致と除外そして明示的に含まれていないフォルダです。

--exclude='/*'そして--exclude='*'

rsync -vvritn --include='BackupOfSettings/' --include='BackupOfSettings/*.tar.gz' --exclude='/*' $openWrtPath ncp:$ncpPath

上記のコマンドは、BackupOfSettings サブフォルダー内のすべてのファイルを受け入れます。この除外はソースディレクトリのファイルとサブフォルダとのみ一致するため、--exclude='/*'一致しません。文書ソースディレクトリのサブフォルダにあります。

関連情報