Linuxにおけるfind -type f | xargs grep {文字列}のコマンド詳解

2020/01/18

author

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 {文字列}

というコマンドで実行すると、特定のディレクトリを指定して配下のファイルを対象に文字列検索させることも可能です。

参考