これは私のソースディレクトリ構造です。
../openwrt
../openwrt/BackupOfPackages
../openwrt/BackupOfSettings
../openwrt/BackupOfImages
rsyncを使用してターゲットディレクトリにミラーリングしたいと思います。 3つのサブディレクトリにあるファイルのみを再同期したい、拡張子を持つファイルのみを同期させたい:
.installed
from thefolderfromthefolderfromthefolderBackupOfPackages
.img.gz
BackupOfImages
.tar.gz
BackupOfSettings
私のソースディレクトリには、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コマンドを変更するには:
.installed
BackupOfPackages
フォルダへフォルダ
.img.gz
へBackupOfImages
フォルダ
.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に変更することもできます。BackupOf
BackupOfImages/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
- rsyncを使用してこれを達成するには、まず必要なファイルを含むサブディレクトリを含める必要があります。
--include='BackupOfSettings/'
- その後、別のインクルードファイルで同じサブディレクトリに必要なファイルタイプと一致するパターンを定義する必要があります。
--include='BackupOfSettings/*.tar.gz'
- 次に、次を使用して他のすべての項目を除外する必要があります。
--exclude='*'
ファイルの一致と除外そして明示的に含まれていないフォルダです。
--exclude='/*'
そして--exclude='*'
rsync -vvritn --include='BackupOfSettings/' --include='BackupOfSettings/*.tar.gz' --exclude='/*' $openWrtPath ncp:$ncpPath
上記のコマンドは、BackupOfSettings サブフォルダー内のすべてのファイルを受け入れます。この除外はソースディレクトリのファイルとサブフォルダとのみ一致するため、--exclude='/*'
一致しません。文書ソースディレクトリのサブフォルダにあります。