正規表現によるファイルの削除

正規表現によるファイルの削除

[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$'

おすすめ記事