使用正则表达式删除文件

gdo*_*ica 68 unix bash regex rm

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

rm ^A*[0..9]2$
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

Den*_*nis 80

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

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  1. ls 列出所有文件(一行一行,因为结果是通过管道传输的)。

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

    • .*表示任意次数的.,其中.是匹配任何字符的通配符。

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

  3. xargs -d"\n" rmrm lineline通过管道传输到它的每个执行一次。

我哪里错了?

首先,rm不接受正则表达式作为参数。除了通配符之外*,其他所有字符都按字面处理。

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

有关更多信息,请访问正则表达式.info

  • 注意文件名中的空格。 (3认同)
  • 注意 - 某些发行版(如 Mac OS)没有“grep -P”(Perl 正则表达式)。在这种情况下,“grep -E”可能会起作用。 (3认同)

cYr*_*rus 68

或使用find

find your-directory/ -name 'A*[0-9][0-9]' -delete
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个很好的解决方案。我更喜欢它,因为它更简单,您可以先省略末尾的 -delete 标志,以便在批量删除文件之前查看您的正则表达式是否正确。 (9认同)
  • 此外,您可以更好地控制删除的内容,例如添加“-type f” (2认同)

gle*_*man 16

请参阅bash 手册页的文件名扩展部分:

rm A*[0-9][0-9]
Run Code Online (Sandbox Code Playgroud)