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分ぐらい悩んで止めた。