find -exec と find | xargs の違いとかいろいろ

 12年前のMOをあれこれする必要があって、とりあえずコピーして作業。
 lhaのファイルの中に、ある条件のファイル名(たとえばrayforceを含むrayforce.wmv)が含まれているlhaな形式のファイルを探す場合。


 lhaはlha l *.lzhに対応していないので、あれこれ試行錯誤。
 まず最初に、find -exec と find | xargs では以下のように違いがあって、-execの場合は毎回grepが実行されて、xargsの場合はまとめてgrepにファイル名が渡されるという違いが。

[test@hoge test]$ find . -name "*.log"
./1995/test5.log
./1995/test4.log
./1994/test3.log
./1994/test1.log
./1994/test2.log
[test@hoge test]$ find . -name "*.log" -exec echo grep -i zip {} /dev/null \;
grep -i zip ./1995/test5.log /dev/null
grep -i zip ./1995/test4.log /dev/null
grep -i zip ./1994/test3.log /dev/null
grep -i zip ./1994/test1.log /dev/null
grep -i zip ./1994/test2.log /dev/null
[test@hoge test]$ find . -name "*.log" | xargs echo grep -i zip
grep -i zip ./1995/test5.log ./1995/test4.log ./1994/test3.log ./1994/test1.log ./1994/test2.log

 -execの方に/dev/nullがあるのは無いとファイル名が出なくて訳分からないので。
 んで。lhaはlha *.lzhな形式に対応していないのでfind -execで実行する必要あり。
 そういうわけで、ファイルを探すために find . -name "*.lzh" -exec lha -l {} \; | grep hogeとかやってhogeというファイルを含むファイルを探そうとするも、ファイル名が表示されずうまくいかず。


 3分ぐらい悩んでうまく行かなかったので、簡単なscriptを書いて処理。うーむ、いまいちだ。rubyワンライナーで処理しようとして3分ぐらい悩んで止めた。