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命令不支持此类正则表达式。我怎样才能做到这一点?
使用扩展的 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)