【问题标题】:How do I delete folders using regex from Linux terminal如何从 Linux 终端使用正则表达式删除文件夹
【发布时间】:2012-08-12 19:07:43
【问题描述】:

假设我有文件夹:

img1/
img2/

如何从 Linux 终端使用正则表达式删除那些匹配所有以 img 开头的文件夹?

【问题讨论】:

  • 郑重声明,shell 的 glob 通配符表达式不是正确的正则表达式。

标签: regex linux find rm


【解决方案1】:

使用 find 过滤目录

$ find . -type d -name "img*" -exec rm -rf {} \;

正如在 cmets 中提到的,这是使用 shell glob 而不是正则表达式。如果你想要正则表达式

$ find . -type d -regex "\./img.*" -exec rm -rf {} \;

【讨论】:

  • 改善这种情况的一种方法是在find 中添加-maxdepth 1,这样find . -type d -maxdepth 1 -regex "\./img.*" -exec rm -rf {} \; 会更快。
  • 我经常使用你的命令来清理我们生产服务器上的旧备份,但我无法找到一个正则表达式来获取除本月第一天以外的所有文件夹(意味着我想擦除除了每个月的 1 个备份文件夹)。文件夹名称定义如下:“yyyy.mm.dd.hh.MM.ss”(例如:2016.07.29.03.00.19)。甚至find . -type d -regex "\./2016\.*" 也没有返回任何东西......有什么想法吗?
  • 试试find . -type d -regex ".*/2016.*"
  • {} 被文件名替换,\; 标志着传递给 exec 的命令的结束(如果你不转义它会被 shell 占用)
  • Other discussions 还提到$ find . -type d -regex "^\./img.*$" -exec rm -rf {} +
【解决方案2】:

你可以使用

rm -r img*

应该删除当前工作目录中以img开头的所有文件和目录

编辑:

只删除当前工作目录中以 img 开头的目录

rm -r img*/

【讨论】:

  • 这也会删除任何匹配表达式的文件,这个命令会删除所有匹配表达式的文件,而不仅仅是目录。
  • OP 说“匹配一切都以 img 开头?”
  • 如果名称必须以 img 开头,则应使用 ^img.*。没有^ 字符名称可能有img 例如在中间。
  • 因为我的解决方案没有使用完整的正则表达式,只是使用 shell glob 通配符,正如其他评论中提到的那样,在这种情况下不会发生这种情况
【解决方案3】:

在寻找如何使用正则表达式删除目录中的特定文件的过程中,我偶然发现了这篇文章和 Mahmoud Mustafa 的另一篇文章:http://mah.moud.info/delete-files-or-directories-linux

此代码将删除任何内容,包括 0-9 中的四个连续数字,在我的情况下,月份和日期范围为 Jan2002 至 Jan2014 的文件夹:

rm -fr `ls | grep -E [0-9]{4}`

希望能帮助那些四处寻找如何删除单个文件而不是文件夹的人。

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2014-07-09
    • 2023-03-14
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多