diff -r を使用して、壊れたリンクを出力せずに両方のディレクトリを再帰的に比較します。

diff -r を使用して、壊れたリンクを出力せずに両方のディレクトリを再帰的に比較します。

diff -r a bディレクトリを再帰的に比較しています。そして第二。これは、いくつかの切断リンクがあるにもかかわらず、しばしば起こります(2つの同じ切断リンク)。そして第二存在しない同じターゲットを指します)。

違いその後、このような場合のエラーメッセージを印刷し、ゼロ以外の終了コードで終了しますが、ディレクトリは私の本と同じであるため、自動的に終了してゼロで終了したいと思います。

どうすればいいですか?

ベストアンサー1

3.3以降では、次の説明に従ってdiffこのオプションを使用する必要があります。--no-dereferenceフィットハランの答え

残念ながら、以前のバージョンはdiff シンボリックリンクの無視はサポートされていません。:

一部のファイルはディレクトリでも一般ファイルでもありません。シンボリックリンク、デバイス特殊ファイル、名前付きパイプ、ソケットなどの珍しいファイルです。現在、diffシンボリックリンクは通常のファイルとして扱われます。他の特殊ファイルが最上位レベルで指定されている場合は、通常のファイルとして扱われますが、ディレクトリを比較したときにのみそのファイルの存在を報告します。これはpatch、そのファイルの変更を表示できないことを意味します。たとえば、シンボリックリンクが指すファイルを変更すると、diffシンボリックリンクに対する変更ではなく、2つのファイル間の違いが出力されます。

diff特殊ファイルへの変更はオプションで具体的に報告する必要があり、これらの拡張をpatch理解するには拡張を作成する必要があります。

必要なものがrsyncをチェックし、失われたエントリを修正することであれば、rsyncコマンドを再実行できます。やりたくない場合は、ディレクトリチェックサムそれで十分だと思います。

を使用してこれを本当に実行するには、シンボリックリンクをスキップしてdifffindファイルに対して個別にdiffを実行できます。ディレクトリ転送そして第二パラメータとして:

#!/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

または1行で:

for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done

これにより、内容が異なるファイルを識別できます。しかし、そこにはありません。第二

気づく:

  • シンボリックリンクを完全にスキップするため、シンボリックリンク名が存在しないかどうかはわかりません。第二。これを行う必要がある場合は、すべてのシンボリックリンクを識別し、そのリンクが存在することを明示的に確認する2番目のルックアッププロセスが必要です。第二
  • 追加ファイルは次の場所にあります。第二リストは以下で作成されたため認識されません。。あなたのシナリオではこれが問題ではないかもしれませんrsync

おすすめ記事