使っています diff -r a b
ディレクトリaとbを再帰的に比較します。しかし、いくつかの壊れたリンク(aとbの両方のディレクトリに同じ壊れたリンクがあり、同じ存在しないターゲットを指している)があることはよくあります。
diffは、それらの場合のエラーメッセージを出力し、ゼロ以外の終了コードで終了しますが、無音のままにし、ディレクトリが私の本と同じであるため、0で終了します。
どうやってやるの?
diff
のバージョン3.3以降の場合、 Pete Harlanの回答 で説明されているように、--no-dereference
オプションを使用する必要があります。
残念ながら、古いバージョンのdiff
シンボリックリンクを無視することはサポートしていません :
一部のファイルは、ディレクトリでも通常のファイルでもありません。これらは、シンボリックリンク、デバイス特殊ファイル、名前付きパイプ、ソケットなどの異常なファイルです。現在、
diff
はシンボリックリンクを通常のファイルのように扱います。他の特殊ファイルが最上位で指定されている場合は、通常のファイルと同様に処理しますが、ディレクトリを比較するときに、その存在を報告するだけです。つまり、patch
はそのようなファイルへの変更を表すことができません。たとえば、シンボリックリンクが指すファイルを変更すると、diff
は、シンボリックリンクへの変更ではなく、2つのファイルの違いを出力します。
diff
はオプションで特別なファイルへの変更を特別に報告し、patch
はこれらの拡張機能を理解するために拡張する必要があります。
Rsyncを確認する(そしておそらく欠落しているものを修正する)ことだけが必要な場合は、rsyncコマンドをもう一度実行するだけで済みます。そうしたくない場合は、 check-summing the directory で十分です。
これを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にないファイルが識別されます。
ご了承ください:
rsync
シナリオでは問題ではありません。バージョン3.3以降GNU diff
はシンボリックリンクの逆参照をサポートしていませんが、それらが指すパスを比較します。
GNU diffutils
> = 3.3をインストールして、--no-dereference
オプション;そのための短いオプションはありません。
等しいか次の場合、診断はサイレントになります:
シンボリックリンク/tmp/noderef/a/symlink
および/tmp/noderef/b/symlink
異なる
diff
の新しいバージョンを使用できます
GNU diff
3.3のdiffutils
には、--no-dereference
オプションでは、ターゲットではなくシンボリックリンク自体を比較できます。それらが異なる場合は報告し、同意する場合は静かで、壊れているかどうかを気にしません。
オプションがいつ追加されたかはわかりません。 2.8.1には存在しません。