名前付きファイルを検索しようとしていますが、dork
名前付きファイルを除外したいと思いますdork.zip
。また、ディレクトリ権限のエラーも削除しました。
だから、次のようにコマンドを作成します。
find / -name "dork*" -and !"zip" 2>&1 | grep -iv "not"
期待どおりに動作しませんでした。
答え1
find / -name 'dork*' ! -name '*.zip'
2つのテストを使用する必要があります-name
。 1つは一致用dork*
で、もう1つは一致用です*.zip
。 2番目は、!
見つかった名前が一致しないように反転()する必要があります。テストの間には常に暗黙的なANDがあります。
暗黙的なANDを可視化します。
find / -name 'dork*' -a ! -name '*.zip'
また、非標準のGNU構文を使用します。
find / -name 'dork*' -and -not -name '*.zip'
結果のエラーを無視するには、標準エラーストリームを/dev/null
最後にwithにリダイレクトします。2>/dev/null
GNUを使用すると、find
読み取れないディレクトリを入力しないように選択できます。
find / \( -type d -not -readable -prune \) -or \
\( -name 'dork*' -not -name '*.zip' -print \)
答え2
式の構文を誤って理解しましたfind
。私の考えでは、テストが探しているパターンを処理する-name
ことを期待していますが、"dork*" -and !"zip"
-name
単一パターン文字列、どんな表現よりも。これを解析する方法はfind
次のとおりです。 (名前一致dork*
)と(!zip
)!zip
は、基本式とは別のサブ式です-name
。しかし、これは!zip
有効な式ではないため、エラーが発生します。
dork*
(名前が一致)と(名前が一致しない)に似ていることを望みます*.zip
。
find / -name "dork*" -and '!' -name "*.zip"
(-and
実際には必要ありません。明確にするためにここに残しておきます。)
ここにいくつかの追加修正を適用しました。パターンは名前付きファイル*.zip
のみzip
正確に「圧縮」。他の要素の一部ではなく別の要素として認識さ!
れるように空白で区切られfind
、対話式にコマンドを使用する場合、シェルがこれを歴史的な参照として解釈しないように単一引用符として引用しました。
2>&1 and
さて、grep -iv "not"はどうなりますか?エラーメッセージをフィルタリングしようとしていて他のシェルではなくbashを使用している場合は、コマンドオーバーライドを使用して出力とエラーストリームが混在するのを防ぐことができます。
find / -name "dork*" -and '!' -name "*.zip" 2> >(grep -iv "not" >&2)