これは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
再利用のためにスクリプトファイルに入れる方が良いかもしれません。