私はこの作品で遊んでいましたが、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