我目前正在尝试删除几个文件。我想删除所有文件名不是以两位数结尾的文件(当我说以两位数结尾时,我的意思是忽略 .txt 文件结尾)。
文件命名如下:
1031NAME24.txt
0709NAME16.txt
0917NAME82.txt
1106NAME9.txt
1005NAME30433.txt
0623NAME3345.txt
1005NAME112.txt
0318NAME4.txt
0112NAME78452.txt
在此示例列表中,除前三个文件之外的所有文件都应被删除。
我已经尝试过 rm *[!0-9][0-9]?*
,它会删除所有文件,但那些以 1 位数字结尾的文件(例如“ 0318NAME4.txt
, 1106NAME9.txt
”),但我还没想出如何达到我的目标,即只保留以 2 位数字结尾的文件,因为这rm *[!0-9][!0-9]?*
不能按我想要的方式工作。
答案1
请尝试以下不同的方法:
1
find . -regextype posix-egrep -regex '(.*[a-zA-Z][0-9]{3,}.[a-zA-Z]{3})|(.*[a-zA-Z][0-9].[a-zA-Z]{3})' | xargs rm
2
rm -fr `ls | grep -E -v '([0-9])*([a-zA-Z]+[0-9]{2})\.txt'`
3
rm -fr `ls | grep -E '([0-9])*([a-zA-Z]+[0-9]{3,})\..*|([0-9])*([a-zA-Z]+[0-9]{1})\..*'`
顺便说一句,这个工具对于学习正则表达式非常有帮助: https://regexr.com/
您还可以安装 txt2regex (正则表达式构建助手): https://aurelio.net/projects/txt2regex/
答案2
要保留的文件与*NAME[0-9][0-9].txt
模式匹配。您要删除与此不匹配的所有内容。
您需要的是extglob
shell 选项,而您要寻找的模式将是!(*NAME[0-9][0-9].txt)
。
使用前请先测试。我不知道这是否会匹配隐藏文件。
答案3
find . -regextype posix-egrep -regex '(.*[a-zA-Z][0-9]{3,}.txt)|(.*[a-zA-Z][0-9].txt)' | xargs rm
第一组(.*[a-zA-Z][0-9]{3,}.txt)
获取所有文件后面有 3 个或更多数字的文件。第二组(.*[a-zA-Z][0-9].txt)
获取所有文件后面只有 1 个数字的文件。剩下只有 2 个数字的文件。