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

答え2

バージョン3.3以降、GNUはdiffシンボリックリンクの逆参照ではなく、シンボリックリンクが指すパス比較をサポートしています。

diffutilsGNU 3.3以降をインストールし、この--no-dereferenceオプションを使用してください。これに対する近道はありません。

次の場合、または次の場合、診断は自動的に維持されます。

シンボリックリンク/tmp/noderef/a/symlinkとは/tmp/noderef/b/symlink何か

答え3

最新バージョンが利用可能です。diff

diffGNU 3.3には、ターゲットではなくシンボリックリンク自体を比較するdiffutilsオプションが含まれています。--no-dereference異なれば報告し、同意すれば静かにして問題が発生しても構いません。

このオプションがいつ追加されたかは不明です。 2.8.1にはありません。

答え4

このコードは2つのフォルダのファイルを比較しますが、最初のフォルダのファイル名に基づいて使用します。

diffDir() {
    A=$1
    B=$2
    for src in `find $A ! -type l` ; do
        dst=/data/f-stack/freebsd/${src#$A}
        if [ -f $dst ]; then
            GIT_PAGER= git diff --no-ext-diff $src $dst;
        fi
    done
}

diffDir /data/freebsd/freebsd11.0/sys/ /data/f-stack/freebsd/

関連情報