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にはないファイルが識別されます。
ご了承ください:
rsync
for 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
異なる