删除带有正则表达式的文件


40

我试图删除以A开头并以2个数字结尾的文件,但是它没有任何作用。
我试过的

rm ^A*[0..9]2$

我哪里错了?

Answers:


56

您可以使用以下命令删除所有符合条件的文件:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

怎么运行的:

  1. ls 列出所有文件(因为通过管道传输,所以逐行列出)。

  2. grep -P "^A.*[0-9]{2}$" 过滤文件列表,仅保留与正则表达式匹配的文件 ^A.*[0-9]{2}$

    • .*表示出现的任何数量.,其中.是与任何字符匹配的通配符。

    • [0-9]{2}表示正好出现两次[0-9],即任意数字。

  3. xargs -d"\n" rmrm line对于line通过管道传递给它的每一个执行一次。

我哪里错了?

对于初学者,rm不接受正则表达式作为参数。除通配符外*,所有其他字符均按字面意义处理。

另外,您的正则表达式略有偏离。例如,*是指任何出现...在正则表达式,所以A*比赛AAA等等,甚至一个空字符串。

有关更多信息,请访问Regular-Expressions.info


3
当心文件名中的空格。
slhck

1
-d"\n交换机修复的空间问题。

1
注意-某些发行版(如Mac OS)没有grep -P(Perl正则表达式)。grep -E在这种情况下可能会起作用。
bluescrubbie

1
我更喜欢先-I与with一起使用,xargs并且始终先对非致命命令进行测试:xargs -d"\n" -I {} echo "{}"
jozxyqk 2014年

1
解析ls?请参阅指向本文的这个问题。由于存在陷阱,您可能会不想做。rm
卡米尔Maciorowski

45

或使用find

find your-directory/ -name 'A*[0-9][0-9]' -delete

该解决方案将处理奇怪的文件名。


4
这是一个很好的解决方案。我喜欢它,因为它更简单,您可以在大容量删除文件之前先在末尾省略-delete标志,以查看您的正则表达式是否正确。
JAMESSTONEco 2015年

1
此外,您可以控制删除的内容,例如添加-type f
Marco Sulla

可以用来删除文件和文件夹吗?它不适用于非空文件夹。
亚历克斯

@Alex否,目录必须为空(无论如何,这都不是OP的要求),您可以将xargs方法与一起使用rm -f
cyrus


1

使用regexp的解决方案要好200倍,即使您可以在使用命令之前看到哪个文件将被删除,并切断最终管道,该解决方案也要好200倍:

ls | grep -P "^A.*[0-9]{2}$"

然后,如果正确,则使用:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

这要好200倍,因为如果您使用Unix,那么了解如何使用grep非常重要。如果您知道如何使用它,它将非常强大。


1
丹尼斯(Dennis)已经有4年的答案了,但这似乎并没有增加多少。
8bittree '16

1
“ 200次”是一个非常具体的。许多其他命令也非常强大,您需要做的就是学习如何使用它们。
格琳·杰克曼(Glenn jackman)

1

这适用于我的Mac:

rm $(ls | grep -e '^A*[0..9]2$')


0

find 该命令也适用于正则表达式。

检查哪些文件将被删除

find . -regex '^A.*[0-9]{2}$'

删除文件

find . -regex '^A.*[0-9]{2}$' -delete
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.