
私は、次の機能を持つrsyncコマンドを準備しようとしています。1.ディレクトリ内のすべてのファイルをバックアップしますが、ネストされたファイルはバックアップしません。2.特定のディレクトリをバックアップします。3.ソースでファイルが削除されたら、ターゲットディレクトリのファイルも削除します。
rsync -vtr --delete --exclude='*/' --include='includes/*' --include='js/*' --include='css/*' /home/gameboy/abc/* /home/gameboy/PartialMirror/abc/
しかし、これはファイルをコピーするだけで、フォルダーはコピーされず、削除も行われません。コマンドの改善を手伝っていただけますか?
答え1
厳密に言えば、以下は矛盾した目標であると解釈できます。
- ディレクトリ内のすべてのファイルをバックアップするネストされたファイルは除くつまり --exclude='*/'
- 特定のディレクトリをバックアップする - つまり、ネストされたファイルも含める
議論が意図したとおりに機能しなかった理由については、以下を参照してください。さらに下で、目的に合う適切な代替案を参照してください (#1、#3、および #2 のバージョンを満たします)。
コマンドが機能しなかった理由:
rsyncがコマンドライン引数を処理する方法において、次の引数は--exclude='*/'と指定するのと同等です。
--exclude='/' --include='必要なサブフォルダ/'
つまり、コマンドによってネストされたすべてのファイルが除外され、目的のサブフォルダー内のファイルも除外されます。
この問題は、2 番目の観察、つまりソースで削除されたターゲットのファイルが削除されないという点に影響します。実際、コマンドは最上位レベルでそのようなファイルを削除するのに完全に機能します。ただし、1 レベル下のファイルは既に除外されているため削除されません。--delete は --delete-before ではなく --delete-during を参照することを覚えておくと役立ちます。
#1、#3、および#2のバージョンを満たすソリューション: 次のソリューションがあなたのニーズに合うかもしれません
rsync -avz --delete --include='includes/*' --include='js/*' --include='css/*' --exclude='*/*' /home/gameboy/abc/ /home/gameboy/PartialMirror/abc/
次の条件を満たします: 1. 深さ 1 のすべてのファイルとディレクトリをバックアップしますが、ネストされたファイルはバックアップしません。2. 必要なフォルダーをバックアップします。3. ソースにない宛先のファイルを削除します。
もう一つのより面倒な選択は次のとおりです
rsync -vlptgoDd --delete src/ dest/
これは #1 と #3 を満たしていますが、ネストされたファイルはすべて回避されます (フォルダーも *nix のファイルであることに注意してください)。 -r オプションを指定しないようにしたので、再帰的ではありません。削除は機能し、深さ 1 のフォルダーがコピーされます。タイムスタンプの保持 (-t) に加えて、アーカイブのコピー用の他の一般的なオプションも含めました。
異なるフォルダで異なるrsync動作を実現するより標準的な方法は、階層構造を通じてディレクトリごとにフィルタルールを散りばめることです。つまり、固有の動作を要求する各フォルダに固有の.rsync-filterファイルを作成します。たとえば、
rsync -avF src/ dest/