findの出力をdiffの入力にパイプする方法は?

findの出力をdiffの入力にパイプする方法は?

これはbashに関する基本的な質問ですが、解決策が見つかりません。

同じ名前のファイルを含むサブディレクトリがたくさんあり、これらすべてのファイルのIDを比較したいと思います。

ファイルのリストを返すことができます。

find . -name "protein.mol2"

ファイルがクエリとして使用できることを知っています。diff

diff -q --from-file dir1/file dir2/file dir3/file; echo $?

出力をパイプfindに接続する方法はdiff

答え1

このオプションを使用すると、1つのファイルで作業するファイルのリストを読み取るのではなく、1つのファイルを--from-file複数のファイルと比較できます。tar --files-from同様のものがありますが--to-file、どちらを使用するかは変更の相対的な「方向」に依存します。あなたが使用するのは-q違いがあるかどうかを示すだけですので、これはあなたにとって重要ではないことを願っています。

参照ファイルがあり、同じ名前のファイルセットと比較したいとします。したがって、次のいずれかが機能します。

diff -q --from-file dir1/protein.mol2 $(find . -name protein.mol2)
find . -name protein.mol2 | xargs diff -q --from-file dir1/protein.mol2

最初のケースではdiff一度だけ実行され、コレクションに違いがある場合は終了コードが反映されます。

2番目のケースでは、diff複数回実行できます。 2番目の形式は、ファイル数が多い(または非常に長いファイル/ディレクトリ名)、コマンド引数の制限(Linuxシステムでは通常128kB)に達した場合に使用できます。

答え2

努力する

diff -q --from-file $(find . -name "protein.mol2" -print) ; echo $?
  • $( )デフォルトでは、findから挿入されたファイルのリストを作成します。

答え3

自分のアイデンティティを比較したい場合は、チェックサムなどのものを使用して、内容に応じてファイルにタグを付けることを検討してください。

find . -name 'protein.mol2' -exec cksum {} + | sort

出力をファイルとして保存できます。最初の数字のペアが同じ行は(ほぼ確実に)同じファイルを表します。このコマンドの拡張は、IDでファイルをグループ化します。

find . -name 'protein.mol2' -exec cksum {} + |
sort |
while read c1 c2 file
do
    test "$c1-$c2" != "$o1-$o2" && echo
    echo "$file"
    o1="$c1" o2="$c2"
done


1行で書かれていますが、find . -name 'protein.mol2' -exec cksum {} + | sort | while read c1 c2 file; do test "$c1-$c2" != "$o1-$o2" && echo; echo "$file"; o1="$c1" o2="$c2"; done再利用のためにスクリプトファイルに入れる方が良いかもしれません。

関連情報