ある条件を満たすファイルのうち、grepに引っかかるファイルを見つけるには、find、xargs、grepを組み合わせて使う。
しかし、例えば、
$ find / -name "*.*" -type f | xargs grep -n '$PATH' --color
なんてやったりすると、
xargs: grep: Argument list too long
このように返ってきてしまう。
上記はあまりに極端な例だけれども、きちんとfindで条件を絞ってみても、このように失敗する事はあるだろう。
これは、
シェルが展開した文字列が OS の制限 (正確には execve(2) の制限) を越えたためである。
引用元
そうな。
詳細は上記引用元に譲るとして、手っ取り早く問題を解決するには、以下の様にすれば良い。
$ find / -name "*.*" -type f | xargs -n 10 grep -n '$PATH' --color
これは、findの結果10ファイル分でgrepが実行される様に設定したオプション例で、これによって文字数制限に引っかからないらしい。
追記
Permission denied
とかNo such file or directory
とか言われてターミナルが埋まるのが嫌な時はこんな感じでどうぞ。
~~```Bash
$ find / -name "." -type f | xargs -n 10 grep 2> -n '$PATH' --color
## ~~お詫びと訂正~~
~~申し訳ない、上記"追記"の記載内容に不備がございました。
お詫びして訂正致します。~~
~~`Permission denied`とか`No such file or directory`とか言われてターミナルが埋まるのが嫌な時はこんな感じでどうぞ。~~
~~```Bash
$ find / 2> ~/.Trash/ZZZ -name "*.*" -type f | xargs -n 10 grep 2> ~/.Trash/ZZZ -n '$PATH' --color
```~~
~~これは、標準エラー出力の結果として吐き出したファイルを、直接ゴミ箱に突っ込んでます。
ていうかゴミ箱に吐き出させています。
前回の追記の内容を実施すると、カレントディレクトリに、`2>`直後のオプションをファイル名に持つファイルが出来てしまいます。
`rm`コマンドで削除しようとするとそんなオプションないよ、とか言われることもありますので、そういった場合はfinderから削除してください。~~
## 再度のお詫びと訂正
前回のコマンドが誤りというわけではないのですが、シェルコマンドの定番として、ゴミ箱じゃなくて`Null`を指定するっていうのがあるそうです。
以下が標準エラー出力を捨てる検索方法。
```Bash
$ find / 2> /dev/null -name "*.*" -type f | xargs -n 10 grep 2> /dev/null -n '$PATH' --color
以上。