Help us understand the problem. What is going on with this article?

[bash] diffでコマンドの出力の結果を直接比較する。

diffコマンドってLinuxのコンソール上で良く使うのですが、ファイル同士の比較だけしか出来ません。

コマンドの結果を比較したい時ってあるよね!

たとえば、dir1とdir2のファイル構成を比較したいとき。

実直な方法。

$ ls dir1 > file_list.dir1.txt
$ ls dir2 > file_list.dir2.txt
$ diff file_list.dir1.txt file_list.dir2.txt

中間ファイルを作る方法です。
多分一番スタンダードですが、私はあまり中間ファイル残したくない人なので・・・。

コマンドの結果を直接食う!!

コマンドの結果を次のコマンドに渡す手っ取り早い方法、それはパイプ!
でも1つしか使えないし、そもそもdiffはパイプの食わせ方がありません。

コマンドによっては - を指定すると標準入力から入力を待つのもありますが。
私が良く使う例。

ssh.sh
tar czf - * | ssh hoge@fuga.com "tar xzf -"

とか。
ネットの帯域が狭かったころに、圧縮してファイルを転送する方法です。

パイプに結果を流す。

名前付きパイプと言うのがあるのですが、それの説明はまたそのうち。

結論から書くと、

diff <(ls dir1) <(ls dir2)

となります。
<(...) はコマンドの結果を(名前付き)パイプに放り込む方法で、名前付きパイプはファイルと同等の扱いをされます。
この結果、ls dir1の結果 と ls dir2の結果 が名前付きパイプとしてファイル扱いされ、diffによって比較されることとなります。

そんなに使うのかい・・・?

この <(...) って結構使えてですね。
ファイルしか入力に対応してないものとか、標準入力からの入力に対応してるけど複数食わせたいときとかに重宝します。

たとえばー。

cat <(grep -E "^hoge" file) <(grep -vE "^hoge" file) > hoge_head.txt

とかやって、hogeから始まる行だけを先頭にまとめるとか。
何か良い例が思いつきません!

最後に。

bashのコマンドはいろいろありすぎて全部知るのはなかなか大変ですね。
しかし知ってる知らないで結構手数が変わるのでいつか使ってみてください!

wingedtw
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away