存在するこの回答-!
、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)。感嘆符(!)の意味を変えません。