diff -r a bディレクトリaとbを再帰的に比較するために使用しています。ただし、いくつかの壊れたリンク(aとbの両方のディレクトリに同じ壊れたリンクがあり、同じ存在しないターゲットを指している)が頻繁に発生します。
diffはそれらの場合にエラーメッセージを出力し、ゼロ以外の終了コードで終了しますが、サイレントのままにしておき、ディレクトリが私の本と同じであるため0で終了します。
どうやってやるの?
diff -r a bディレクトリaとbを再帰的に比較するために使用しています。ただし、いくつかの壊れたリンク(aとbの両方のディレクトリに同じ壊れたリンクがあり、同じ存在しないターゲットを指している)が頻繁に発生します。
diffはそれらの場合にエラーメッセージを出力し、ゼロ以外の終了コードで終了しますが、サイレントのままにしておき、ディレクトリが私の本と同じであるため0で終了します。
どうやってやるの?
回答:
バージョン3.3以降ではdiff、Pete Harlanの回答で--no-dereference説明されているように、オプションを使用する必要があります。
残念ながら、の古いバージョンはdiff シンボリックリンクの無視をサポートしていません:
一部のファイルは、ディレクトリでも通常のファイルでもありません。それらは、シンボリックリンク、デバイス特殊ファイル、名前付きパイプ、ソケットなどの珍しいファイルです。現在、
diff通常のファイルのようにシンボリックリンクを扱います。トップレベルで指定されている場合、通常のファイルのような他の特別なファイルを扱いますが、ディレクトリを比較するとき、それらの存在を単に報告します。これは、そのpatchようなファイルへの変更を表すことができないことを意味します。たとえば、シンボリックリンクが指すdiffファイルを変更すると、シンボリックリンクへの変更の代わりに、2つのファイル間の差分が出力されます。
diffオプションで特別なファイルへの変更を特別に報告し、patchこれらの拡張子を理解するために拡張する必要があります。
必要なのがrsyncを検証する(そしておそらく欠落しているものを修正する)だけであれば、rsyncコマンドをもう一度実行するだけで済みます。そうしたくない場合は、ディレクトリのチェックサムで十分です。
でこれを本当に行いたい場合はdiff、を使用findしてシンボリックリンクをスキップし、各ファイルに対して個別にdiffを実行できます。ディレクトリaおよびbを引数として渡します。
#!/bin/bash
# Skip files in $1 which are symlinks
for f in `find $1/* ! -type l`
do
# Suppress details of differences
diff -rq $f $2/${f##*/}
done
またはワンライナーとして:
for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done
これにより、コンテンツが異なるファイル、またはaにあるがbにはないファイルが識別されます。
ご了承ください:
rsyncfor f in a / *を見つける!-type l ;do echo $f b/${f#*/};done。でも今はこれをテストする時間がありません。それが機能するかどうか教えてください。
$(xxx)バックティックの代わりに常に使用します。バックティックの対称性は、それらを読みにくくし、ネストを防ぎます。1および2については、stackoverflow.com
バージョン3.3以降、GNU diffはシンボリックリンクの逆参照をサポートしていませんが、それらが指すパスを比較します。
GNU diffutils> = 3.3 をインストールし、--no-dereferenceオプションを使用します。そのための短いオプションはありません。
同等または以下の場合、診断はサイレントになります。
シンボリックリンク/tmp/noderef/a/symlinkと/tmp/noderef/b/symlink異なる