`find -!?でマイナス記号(-)の用途は何ですか? -exec`サービス?

`find -!?でマイナス記号(-)の用途は何ですか? -exec`サービス?

存在するこの回答-!、inの用途は何ですかfind

次のコードを考えてみましょう。

find . -type l -! -exec test -e {} \; -print

この回避策は同じことをするようです。

find . -type l ! -exec test -e {} \; -print

-!のように見える!ことは、次の表現の否定を意味します。これは意味があります。しかし、なぜ!その時だけではないのですか?そのような構文に関する文書が見つからないようです。

答え1

-!標準演算子以外の句読点演算子を許可することは、GNU findのコマンドラインパーサーの珍しい点です(他の句読点演算子(、およびGNU専用演算子)!にも同じことが当てはまります)。コードが奇形のような場合を拒否しないと、書くのがやや簡単になります。それ以外の場合はエラーが発生するため、これを受け入れるには何の害もありません。 POSIX標準は、これが何を意味するのか言っていません。標準に関する限り、これは実装によって定義された述語であり、実装はそれを自由に使用して必要なものを意味できます。(),-!-!-!

以下は、GNU findのコードの仕組みの概要です。

  • パーサーコードにオペレーターリスト。演算子は、-コードを少し小さく、すばやく作成するためにリードなしで保存されます。
  • これコマンドラインパーサー着信電話looks_like_expression引数が述語のように見えるかどうかを決定します。-単一の句読点文字演算子を除いて、述部はで始まります。
  • 述語が決まったら、find_parser-先行がある場合は無視してください。ここ!での違いは-!消えます。

looks_like_expressionあるいは、find_parser拒否-の後に句読点が続くこともあります。ただし、どちらにしても実質的な利点なしに追加のコードが必要です。

答え2

これ-!例では、「リンクではなくすべての項目を一覧表示する」を意味する「-type l」表現を否定します。

-type lは、「file」がリンクの場合にのみtrueになります。 - !

検索マンページから:

The POSIX standard specifies parentheses `(', `)', negation `!' and the `and' and `or' operators ( -a, -o).

マイナス記号はオプションの区切り記号です。他のコマンドと同様に、各オプションはマイナス記号で区切られます(たとえば、ls -l)。感嘆符(!)の意味を変えません。

関連情報