Linuxコマンド:ファイルを見つけてコマンドを実行する


16

ディレクトリとサブディレクトリ内のすべてのファイルを見つけてコマンドを実行する方法を教えてください。

例えば、

find . -type f -name "*.txt" 

すべてのtxtファイルを検索し、

find . -type f -name "*.txt" | gedit

これをgeditに送信しますが、テキストファイル内です。geditですべてのテキストファイルを開きます。

回答:


22

-execフラグを使用して、一致する各ファイルに対してコマンドを実行できます。

$ find ./ -type f -name "*.txt" -exec gedit "{}" \;

構文

構文は少し奇妙です(詳細-exec command ;はマンページを参照してください):

The string `{}' is replaced by the current file name being processed

-execdir同じことを行いますが、一致したファイルを含むサブディレクトリからコマンドを実行することも検討することをお勧めします(これが一般的に推奨されます)。


1
ありがとう。私はそれがうまくいくのを見ます。しかし、末尾( "{}" \ :)はどういう意味ですか?リストを実行しますか?

1
{}現在のファイル名のために立って、セミコロンだけでコマンドを終了しています。バックスラッシュとその前後の引用符は、シェルの展開を防ぐためのものです。
David Cain

5

find . -type f -name "*.txt" -print0 | xargs -0 gedit


ありがとう。私はそれがうまくいくのを見ます。しかし、-print0 | xargs -0部分はどういう意味ですか?

1
@xyz、あなたはの旗について読むことができます任意の manページを使用してUNIXコマンド。試してみてくださいman findまたはman xargs、その後、/与えられたフラグを検索します。ドキュメントはかなり良いです、それはあなたの質問に答えるべきです。
David Cain

1
-print0各エントリの後にNULL文字を出力します-0。エントリがNULL文字で区切られていることを想定しています。トリッキーな名前を処理する最も安全な方法です。
ノーティリスト2013年

また、構文がxargs -0 geditではなくgedit xargs -0ではないことは少し変ではありませんか。前者は機能しないようですが、その理由はわかりません。

3
xargsは、geditに渡す前に多数の引数を「バッチ処理」できるため、パフォーマンス上の理由から-execよりもxargsの方が適しています。各ファイルに対して個別にgeditを実行する必要がある場合は、 '... -print0 | xargs -0 gedit 'with' ... -print0 | xargs -0 -i gedit {} 'xargsは、findやscreenのようなコマンドの1つであり、1年が経てないと理解できません。
アークライト2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.