`検索`複数-o -name条件AND!

`検索`複数-o -name条件AND!

私はこの作品で遊んでいましたが、find私が望む方法で動作させることはできないようです。 Googleを試してみましたが、チュートリアルのどれもこの状況を解決できないようです。

次のファイルがあるとしましょう。

test-[done].mkv
test.mkv
test2.avi
test3.mp4

私が望むのは、名前のあるものを除いてfindすべてを選択することです。.mkv OR .avi OR .mp4[done]

最初の条件は簡単に解決できます。

find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) -print

しかし、2番目の条件の実行に問題があります。

find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) ! \( ! -name '*[done]*' \) -print

それでも `test-[done].mkv が表示されます。

test-[done].mkv
test.mkv
test2.avi
test3.mp4

できるだけ多くの-nameを使用できると考えて正規表現を試しましたが、それでも運はありません。

[root@xxxx]# ls
test-[done].mkv  test.mkv  test2.avi  test3.mp4
[root@xxxx]# find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) ! \( -regex '.*\(\[done\]\)$' \) -print
test-[done].mkv
test.mkv
test2.avi
test3.mp4

誰でもこの問題を解決するのに役立ちますか?ありがとうございます!

答え1

あなたの-nameバージョンではこれは! -name '*[done]*'必要ありません! -name '*\[done\]*'。それ以外の場合は、角かっこ内の文字を文字セットとして扱い、「d」、「o」、「n」、または「e」文字を含むすべてのファイル名を除外します(あなたの名前も含みます)。 )には「e」が含まれています)。次に、すべてのファイルを除外するのではなく、すべてのファイルを含めるように条件を2番目に無効にします。しかし、修正されたバージョンは次のとおりです。

find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) \( ! -name '*\[done\]*' \) -print

$パターンマッチングの直後に正規表現バージョンが間違っていますが、[done]実際のファイル名の対応するポイント以降はまだファイル拡張子がありますが、以前.*に追加すると$機能します。

find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) ! \( -regex '.*\(\[done\]\).*$' \) -print

関連情報