如何删除所有名称不是以 2 位数字结尾的文件?

如何删除所有名称不是以 2 位数字结尾的文件?

我目前正在尝试删除几个文件。我想删除所有文件名不是以两位数结尾的文件(当我说以两位数结尾时,我的意思是忽略 .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模式匹配。您要删除与此不匹配的所有内容。

您需要的是extglobshell 选项,而您要寻找的模式将是!(*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 个数字的文件。

相关内容