-execコマンドを知っていますか? [コピー]

-execコマンドを知っていますか? [コピー]

これは効果があります

find ./ -iname '*.c' -o -name '*.h' -o -name '*.l' -exec grep -irn test1 {} \;

lsと一緒に使用すると、-execこれが無効なオプションであることを知らせます。

#ls -exec touch {} \;
ls: invalid option -- 'e'
Try 'ls --help' for more information.

この-execオプションは他のコマンドではなくfindでのみ使用されることは私の理解ですか?

ベストアンサー1

コマンドを理解する最善の方法は、そのマニュアルを読むinfo lsことinfo findですman ls/man find。または、各POSIX仕様について学び、他のすべての実装に共通して適用されるサブセットを理解してください。

構文は次のとおりfindです。

find [options] <file1> [<file2>...] [predicates]

(一部のfind実装ではスキップを許可します<file1>

そしてls

ls [options] [<file1> [<file2>...]]

[...]オプション部分を示します)。

標準オプションは単一文字です-。一部の人々はその主張を受け入れ、一部の人々は受け入れません。オプションはパラメータに結合できます。たとえば、で書くことがls -l -dできますls -ld

-execしたがって、これはオプションではないことがわかります。findこれは、オプションが次のように解釈されるためです-e -x -e -c(またはオプションが引数を受け入れる-e -x ec場合-x)。

一部のツールはサポートを実装しています。長いオプションがありますが、これらの競合を避ける--ために、これらのオプションの前にはプレフィックスが付いています。-たとえば、GNUfindとGNUの両方がlsサポートされています。--help オプション

の場合はfindPOSIX-exec呼び出しスルブ。それではないオプション。それ表現するこれはファイルのリストの後ろにあり、どのファイルが選択され、そのファイルに対して何が行われるかを決定するために使用されます。

find一部のオプションもサポートされています(今後-L/などのファイルリスト)は-Hグローバル動作に影響します。

ls概念なしスルブ...でもない表現するファイルを選択するために使用されます。その行動は、以下によってのみ制御されます。オプションls任意のコマンドを実行するオプションはありません。

ところで、コードにはいくつかの問題があります。

  • -a(省略した場合は暗示されます)が優先され、ファイルに対してのみ実行されます-o。バラより-exec*.l複数の '-name' と '-exec' を持つ 'find' は、最後に表示される '-name' のみを実行します。
  • -rを使用しようとしました。grepこれは、作業を完了し、ディレクトリ内のファイルを見つけるgrepためにいくつかの実装でサポートされている非標準オプションです。find見つかったファイルの中に、対応するfindディレクトリタイプがないと有害ではないかもしれませんが、必要ではないかもしれません。
  • 構文を使用すると、ファイルごとに1つずつ実行{} \;できます。grepこれは非常に非効率的です。これはまた、grepファイル名が表示されないことを意味します(-r上記で始まらない限り)。
  • これは-iname非標準拡張です(info findGNU拡張の場合はシステムには見つかりますが、POSIX仕様では見つかりません)。
  • -type述語を使用しないため、find通常のファイルだけでなく、すべての種類のファイルが報告されます。これには、ディレクトリ、デバイス、FIFO を含めることができます。を使用すると、-type f検索は次のように制限されます。定期的な文書。 GNUを使用すると、シンボリックリンクの確認後に通常のファイルになるファイルを選択するfindこともできます。-xtype f

これらの問題を解決するには、次のようにします。

find . -name '*.[cChl]' -type f -exec grep -in test1 /dev/null {} +

おすすめ記事