find コマンドについて [閉じる]

find コマンドについて [閉じる]

名前付きファイルを検索しようとしていますが、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)

関連情報