西槇 (2011年5月14日 23:23) 企画開発部 / Linux
膨大な数のファイルの中から特定の文字列が含まれるファイルを抽出する場合、 以下のようなコマンドを実行すると思います。
例)test という文字列を含むファイルを検索する場合
grep "test" *
ディレクトリ内のファイルが少ない場合には、問題ありませんが 検索するターゲットとするディレクトリに膨大な数のファイルがある場合、
Argument list too long というエラーが表示され、grepコマンドが実行されません。 そんな場合に便利なのが、xargs です。 xargsは、標準入力の内容を、そのまま別のコマンドの引数として実行させるために 使います。
例えば、膨大な数のファイルからtestという文字列が含まれているファイル名を抽出したい場合は
find . -type f -print0 | xargs -0 grep -l "test"
というコマンドを実行することで、ファイルの名前が一覧で表示されます。
ファイル名のリストをファイルに出力したければ、以下のように標準出力を ファイルにリダイレクトしてあげればよいでしょう。
find . -type f -print0 | xargs -0 grep -l "test" > testlist.txt
私がこのコマンドを使う場面は、 メールを誤って削除してしまった社員に、メールの復旧依頼を受けた際 全てのメールをアーカイブしているディレクトリから、該当のメールを時間や メールアドレスで絞り込んで復旧させる場合に使うことが多いです。
例えば、「1時間前ぐらいに、xxxx@xxxx.com のメールアドレスから来たメールを 復旧して欲しいんだけど。」といわれた場合には、以下のようなコマンドを実行します。
find . -type f -mmin -60 -print0 | xargs -0 grep -l "xxxx@xxxx.com" > /tmp/xxxxlist.txt
/tmp/xxxxlist.txt にはファイル名の一覧が表示されるので、ファイルの中身を表示し 必要なファイルを最終的に確認し、本人に渡します。
xargsを使うまでは、ファイル名の先頭数文字毎にgrepする作業を何回にも分けて以下のようなコマンドをひたすら実行するという、無駄な作業をしていました。 なんとも、無駄な気の遠くなる作業ですね。
grep "xxxx@xxxx.com" 1* grep "xxxx@xxxx.com" 2* grep "xxxx@xxxx.com" 3* grep "xxxx@xxxx.com" 4* grep "xxxx@xxxx.com" 5* ・・・・・・・
Linuxでxargsを使って膨大なファイルを処理する
西槇 (2011年5月14日 23:23)
企画開発部 / Linux
膨大な数のファイルの中から特定の文字列が含まれるファイルを抽出する場合、
以下のようなコマンドを実行すると思います。
例)test という文字列を含むファイルを検索する場合
ディレクトリ内のファイルが少ない場合には、問題ありませんが
検索するターゲットとするディレクトリに膨大な数のファイルがある場合、
Argument list too long というエラーが表示され、grepコマンドが実行されません。
そんな場合に便利なのが、xargs です。
xargsは、標準入力の内容を、そのまま別のコマンドの引数として実行させるために
使います。
例えば、膨大な数のファイルからtestという文字列が含まれているファイル名を抽出したい場合は
というコマンドを実行することで、ファイルの名前が一覧で表示されます。
ファイル名のリストをファイルに出力したければ、以下のように標準出力を
ファイルにリダイレクトしてあげればよいでしょう。
私がこのコマンドを使う場面は、
メールを誤って削除してしまった社員に、メールの復旧依頼を受けた際
全てのメールをアーカイブしているディレクトリから、該当のメールを時間や
メールアドレスで絞り込んで復旧させる場合に使うことが多いです。
例えば、「1時間前ぐらいに、xxxx@xxxx.com のメールアドレスから来たメールを
復旧して欲しいんだけど。」といわれた場合には、以下のようなコマンドを実行します。
/tmp/xxxxlist.txt にはファイル名の一覧が表示されるので、ファイルの中身を表示し
必要なファイルを最終的に確認し、本人に渡します。
xargsを使うまでは、ファイル名の先頭数文字毎にgrepする作業を何回にも分けて以下のようなコマンドをひたすら実行するという、無駄な作業をしていました。
なんとも、無駄な気の遠くなる作業ですね。