私の正規表現に何が問題なのかわかりません。ではうまくいくようですが、grep
今はうまくいきませんfind
。テレビ番組の一般的な表現に従うすべてのファイルを見つけようとしています。S02E21。
find -E . -name '.*[sS]{1}[0-9]{1,2}[\.]?[eE]{1}[0-9]{1,2}.*\.mkv'
結果は得られませんが、find
同じ正規表現を使用すると、ファイルが期待ls|grep -E '....'
どおりに見つかります。
ベストアンサー1
-name
必要ワイルドカードパターンは正規表現ではなく、フルパスではないファイル名と一致します。正規表現の一致には-regex
(または)を使用し-iregex
ますが、フルパスと一致します。ここでは、次のことができます。
LC_ALL=C find -E . -iregex '.*s[0-9]{1,2}\.?e[0-9]{1,2}[^/]*\.mkv'
ここでは、2番目のパターンを/ではなく一連の文字.*
で置き換えて、パターンがディレクトリコンポーネントではなくファイル名と一致することを確認します。[^/]*
ロケールをCで固定してLC_ALL=C
.
、すべてのバイト、およびを[^/]
除くすべてのバイトが一致することを確認します。/
そうしないと、ロケールとは異なる文字セットでエンコードされたファイルまたはディレクトリ名に問題が発生する可能性があります。ロケールをCに変更すると、and(および)とのみ一致することがe
保証されます。e
E
s
s
S
-iregex
バック[\.]
スラッシュまたはドットが一致します。ポイントを一致させるには\.
または[.]
。また、単純化のために削除したx{1}
ものと同じです。x
{1}
確認するあなたのマニュアルページもっと学ぶ。両方またはそうでないことに-E
注意してください。-regex
-iregex
基準。
次のように単純化できます。
LC_ALL=C find -E . -iregex '.*s[0-9]{1,2}\.?e[0-9][^/]*\.mkv'
2番目の数字が1つでもあれば、とにかく一致します[^/]
。
ワイルドカードパターンを使用する標準は次のとおりです。
LC_ALL=C find . -name '*[sS][0-9][0-9].[eE][0-9]*.mkv' \
-o -name '*[sS][0-9].[eE][0-9]*.mkv' \
-o -name '*[sS][0-9][0-9][eE][0-9]*.mkv' \
-o -name '*[sS][0-9][eE][0-9]*.mkv'
拡張正規表現とは異なり、ワイルドカードパターンには代替演算子、それに対応するもの、またはなしがあるため、?
すべて{n,p}
の可能性をカバーするには4つのパターンが必要です。
次の再帰ワイルドカードおよび高度なワイルドカードパターンでシェルを使用することもできますzsh
。
setopt extendedglob
ls -lrtd -- **/(#i)*s<->e<->*.mkv
**/
再帰検索(#i)
大文字と小文字を区別しない一致<->
任意の素数
ここに渡すと、ls -lrtd
最後の変更時刻に基づいてソートされた詳細を含むリストが印刷されます。もちろん、すべてのコマンドを使用できます。