[0-9A-Z]{1,2}_\d{4}_\w+?\.dat
たとえば、A1_2001_pm23aD.dat
同じ名前のファイルを保持し、K_1998_12.dat
残りを削除したいと思います。
ただし、ls
コマンドrm
はこれらの正規表現をサポートしません。どうすればいいですか?
ベストアンサー1
拡張グローブを使用してください。
shopt -s extglob
printf '%s\n' !([[:digit:][:upper:]]?([[:digit:][:upper:]])_[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_+([[:alnum:]]).dat)
これは!
()と一致しないすべてのファイル/ディレクトリ名を印刷し、[[:digit:][:upper:]]
その後に0または1、sの間に4 [[:digit:][:upper:]]
、拡張子の前に1つ以上が続きます。再帰的に検索するには:[[:digit:]]
_
[[:alnum:]]
.dat
shopt -s globstar
shopt -s extglob
printf '%s\n' **/!([[:digit:][:upper:]]?([[:digit:][:upper:]])_[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_+([[:alnum:]]).dat)
または、以下を使用しますgnu find
(正規表現を使用できます)。
find . -regextype egrep ! -regex '.*/[[:digit:][:upper:]]{1,2}_[[:digit:]]{4}_[[:alnum:]]+\.dat$'