[Linux] find -type f | xargs grep {文字列}のコマンド詳解
2020/01/18
masyus
Linuxで、カレントディレクトリ配下にあるファイルを対象に文字列検索する時によく使う
find -type f | xargs grep {文字列}
についてのメモ書き兼解説です。よく使う割に内容を正しく理解しきれていないことがあったため、改めて具体的に何をどのように検索しているのか紹介します。
find -type fの意味
findコマンドは
find {文字列}
という使い方が基本となります。{文字列}
というファイル名もしくはディレクトリ名をカレントディレクトリにて検索してくれます。また、{文字列}
を指定しない場合は
カレントディレクトリ以下を対象とした、全てのファイルとディレクトリをリストアップ
することが可能です。今回解説するfindコマンドはこのリストアップ機能を活用しています。
-type fオプションとは
find {文字列} -type f
のように-type f
オプションをつけた場合、ファイルのみを対象として検索することができるようになります。余談にはなりますが-type d
にするとディレクトリのみを検索対象とすることも可能です。
以上を総合しますと
find -type f
は、カレントディレクトリ以下にあるファイル名を全てリストアップしてくれるコマンドになります。
|の意味
|
は「パイプ」と読みます。パイプの前後にコマンドを書くことで
パイプの前のコマンドの入出力をパイプの後のコマンドへ引き渡す
ことができます。英語の関係代名詞の役割に近いです。実際の使い方は以下で解説します。
xargsの意味
xargs
は標準入力やファイルからリストを読み込み、コマンドラインを作成して実行してくれます。具体的には
find -type f | xargs {コマンド}
と書くことで
xargsの後ろに記載した{コマンド}
をfind -type f
で出力されたファイルリストの行単位で適用し、実行する
ことが可能になります。例えばカレントディレクトリ配下のファイルが
find -type f
./aaa.txt
./bbb.txt
./ccc.txt
./ddd/eee.txt
./ddd/fff.txt
./ddd/ggg/hhh.txt
というリストだったとして、それぞれのファイルの中身が
cat aaa.txt
hoge
cat bbb.txt
hogehoge
cat ccc.txt
hogehogehoge
cat ddd/eee.txt
fuga
cat ddd/fff.txt
fugafuga
cat ddd/ggg/hhh.txt
aaaaa
だった場合のfind -type f | xargs cat
の実行結果は下記になります。
find -type f | xargs cat
aaaaa
fuga
fugafuga
hoge
hogehoge
hogehogehoge
諸事情でいきなり{コマンド}
を実行するのが億劫な場合は-p
オプションをつけることで、dry-run(実行予定のコマンドを教えてくれる) することもできます。
find -type f | xargs -p cat
cat ./ddd/ggg/hhh.txt ./ddd/eee.txt ./ddd/fff.txt ./aaa.txt ./bbb.txt ./ccc.txt ?...
補足ですが上記を見てもわかるように、xargsによるコマンドの実行順序はパイプする前のリスト順になるわけではないようです。
grepの意味
grep
はファイルの中の特定の文字列がある行を抽出するコマンドです。細かい解説は割愛しますが、
cat aaa.txt
hoge
fuga
aaaaa bbbbb
というファイルがあった場合、aaaaa
の文字列に合致する行だけを抽出したい場合は下記になります。
grep aaaaa aaa.txt
aaaaa bbbbb
総論
以上を踏まえますと、find -type f | xargs grep {文字列}
は
カレントディレクトリ配下にあるファイルを対象に文字列検索する
という動きになります。
また、余談になりますがfind -type f
がカレントディレクトリを対象にとるのはこのコマンドがfind . -type f
を省略しているからであるため、
find {ディレクトリパス} -type f | xargs grep {文字列}
というコマンドで実行すると、特定のディレクトリを指定して配下のファイルを対象に文字列検索させることも可能です。