だから私はコマンドラインに最初に触れました。ファイルに特定の場所がないため、findを使用して複数のディレクトリから複数のファイルの出力を取得できました(短縮できると確信しています)。
find ./ -name filename1.ext && find ./ -name filename2.ext && find ./ -name filename3.ext
これで私は欲しいリストを提供しますが、今問題のファイルを見つけたので、そのファイルを見つけて情報を取得しようとしています。
答え1
name
すべての項目をfindステートメントにグループ化し、findにgrepを実行させることができます。
find . \( -name filename1.ext -o \
-name filename2.ext -o \
-name filename3.ext \) \
-exec grep 'pattern' {} \;
答え2
この試み、
find ./ -type f \( -name filename1.ext -o -name filename2.ext -o -name filename3.ext \) -exec grep 'string' {} \;
-type f
ファイルを探しているので、より高速な結果を得るためにタイプを指定することをお勧めします。-o
検索にさらにファイル名を追加できる「または」を示します。
答え3
正解は実際に-o
andを使用することです-exec
。前のコマンドの出力をキャプチャして1行ずつ解析する一般的な方法は次のとおりです。
(find .... && find ... && cat ... && ls ... && ...) | while read line; do grep string $line; done
答え4
find
一般に、+結合には少なくとも3つの方法がありますgrep
。
grep
模様`find
目次 指定子の検索-print`
find
目次 指定子の検索-exec grep
模様{} \;
find
目次 指定子の検索-print | xargs grep
模様
もちろんgrep
ここには特別なものはありません。この同じ 3 つのパターンをすべてのコマンドfind
で使用できます。
ある意味では、方法1は最も古く、最も基本的な方法です。バックティックは、常にあるコマンドの出力をキャプチャして別のコマンドのコマンドラインで使用する方法だったからです。 (最近、バックティックよりも良いバシズムが新しくなって、素敵な子供たちは使い尽くすような気がしますが、私は昔ながらかと思います。find
)
2番は、+コマンドの組み合わせをfind
実行するために組み込まれた特殊機能です。find
一度は大丈夫ですが、2つの欠点があります。 (1)grep
見つかったすべてのファイルに対して補助コマンド(または他のコマンド)を再度呼び出すことで速度が遅くなる可能性があり、(2)補助コマンドが次の場合、grep
各呼び出しにgrep
ファイル名が表示されるため、一致するファイル名表示されません。ただし、次の手順を実行してこの問題を解決できます。-exec grep
模様 {} /dev/null \;
または最近-exec grep -H
模様 {} \;
。
それから3番目。私が知る限り、xargs
最初の2つの制限を克服するために発明されました。xargs
理論的には汎用プログラムですが、実際には、および他のプログラムペアと一緒にfind
使用されることがほとんどないと考えられますgrep
。これは最初の欠点を完全に解決します。見つかったファイルの数に関係なく動作します。うまくいきますが、運が良くない場合は時々最後のファイル名を呼び出すことになるので、まだorトリックをgrep
使いたいという意味です。独自の欠点があります。見つかったファイル名にスペースが含まれていると機能しません。しかし、回避策もあります。/dev/null
-H
find
目次 指定子の検索 -print0 | xargs -0 grep
模様
xargs
(デフォルトでは、スペースの代わりに改行で区切られたファイル名を許可するように作成したいのですが、これは別の日の好言状になります。)