diff
コマンドの出力(この場合)をファイルにリダイレクトしたいが、比較するファイルに違いがある場合にのみ可能です。たとえば、、、、a
3b
つのファイルがあるとします。c
ここで、a
とb
は同じですが、a
そうc
ではありません。
diff a c > output.txt
これにより、diff a b > output.txt
違いがあるかどうかにかかわらずoutput.txt
生成されます。output.txt
違いがある場合にのみ生成したいです(たとえば、差が1を返します)。
私は似たようなことをしたい:
if ! diff a c > /dev/null; then
diff a c > output.txt
fi
ただし、コマンドを2回実行する必要はありません。私できる次のようにコマンドの内容を保存します。
res=$(diff a c)
if [ $? != 0 ]; then
echo "$res" > output.txt
fi
しかし、私はecho
「仲介者」として介入し、いくつかの問題を引き起こす可能性があります。コードを複製せずに出力がある場合にのみ、出力をリダイレクト/ファイル生成する方法は?
答え1
コマンドを一度呼び出して出力をリダイレクトし、違いを作成せずに出力を削除できます。
diff a c > output.txt && rm output.txt
答え2
diff
少なくともファイルが異なる場合、比較的高価なコマンドです。最小変更セットを計算するには(相対的に)CPUを大量に使用します。だから二度やりたくないのも理解になります。
cmp
しかし、CPUに関する限り、価格は安いです。ファイルサイズが合理的であると仮定すると(複数のGBファイルに対してdiffを呼び出すかどうか疑問です)、パフォーマンスのコストはほとんどなく、同じファイルを使用すると高速になる可能性があります。
if ! cmp -s a c; then # -s = silent, do not print results to console
diff a c > output.txt
fi
答え3
一時ファイルはどうですか?
diff a c > /tmp/output.txt
if [ $? != 0 ]; then mv /tmp/output.txt /my/folder/output.txt; else rm -f /tmp/output.txt; fi
確認ダイアログを削除するには、-f
に置き換えます。-i
これにより、echo、printfなどの一時変数や「仲介者」なしでコマンドを2回実行するだけです。