通过正则表达式删除文件

ddz*_*wmm 4 shell bash filenames regular-expression wildcards

我想保留名称匹配的文件[0-9A-Z]{1,2}_\d{4}_\w+?\.dat,例如,A1_2001_pm23aD.dat, K_1998_12.dat,并删除其余文件。

但是,ls和rm命令不支持此类正则表达式。我怎样才能做到这一点?

don*_*sti 5

使用扩展的 globs:

shopt -s extglob
printf '%s\n' !([[:digit:][:upper:]]?([[:digit:][:upper:]])_[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_+([[:alnum:]]).dat)
Run Code Online (Sandbox Code Playgroud)

这将打印所有不!匹配的文件/目录名称 ( )[[:digit:][:upper:]]后跟零或 1[[:digit:][:upper:]]后跟s[[:digit:]]之间_的4 ,然后[[:alnum:]]是扩展名之前的一个或多个.dat。
如果要递归搜索:

shopt -s globstar
shopt -s extglob
printf '%s\n' **/!([[:digit:][:upper:]]?([[:digit:][:upper:]])_[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_+([[:alnum:]]).dat)
Run Code Online (Sandbox Code Playgroud)

或者,使用gnu find(您可以使用正则表达式):

find . -regextype egrep ! -regex '.*/[[:digit:][:upper:]]{1,2}_[[:digit:]]{4}_[[:alnum:]]+\.dat$'
Run Code Online (Sandbox Code Playgroud)