diff -r a b
ディレクトリを再帰的に比較しています。ㅏそして第二。これは、いくつかの切断リンクがあるにもかかわらず、しばしば起こります(2つの同じ切断リンク)。ㅏそして第二存在しない同じターゲットを指します)。
違いその後、このような場合のエラーメッセージを印刷し、ゼロ以外の終了コードで終了しますが、ディレクトリは私の本と同じであるため、自動的に終了してゼロで終了したいと思います。
どうすればいいですか?
答え1
3.3以降では、次の説明に従ってdiff
このオプションを使用する必要があります。--no-dereference
フィットハランの答え。
残念ながら、以前のバージョンはdiff
シンボリックリンクの無視はサポートされていません。:
一部のファイルはディレクトリでも一般ファイルでもありません。シンボリックリンク、デバイス特殊ファイル、名前付きパイプ、ソケットなどの珍しいファイルです。現在、
diff
シンボリックリンクは通常のファイルとして扱われます。他の特殊ファイルが最上位レベルで指定されている場合は、通常のファイルとして扱われますが、ディレクトリを比較したときにのみそのファイルの存在を報告します。これはpatch
、そのファイルの変更を表示できないことを意味します。たとえば、シンボリックリンクが指すファイルを変更すると、diff
シンボリックリンクに対する変更ではなく、2つのファイル間の違いが出力されます。
diff
特殊ファイルへの変更はオプションで具体的に報告する必要があり、これらの拡張をpatch
理解するには拡張を作成する必要があります。
必要なものがrsyncをチェックし、失われたエントリを修正することであれば、rsyncコマンドを再実行できます。やりたくない場合は、ディレクトリチェックサムそれで十分だと思います。
を使用してこれを本当に実行するには、シンボリックリンクをスキップしてdiff
各find
ファイルに対して個別に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
シンボリックリンクの逆参照ではなく、シンボリックリンクが指すパス比較をサポートしています。
diffutils
GNU 3.3以降をインストールし、この--no-dereference
オプションを使用してください。これに対する近道はありません。
次の場合、または次の場合、診断は自動的に維持されます。
シンボリックリンク/tmp/noderef/a/symlink
とは/tmp/noderef/b/symlink
何か
答え3
最新バージョンが利用可能です。diff
diff
GNU 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/