删除名称中包含字符串的所有文件

删除名称中包含字符串的所有文件

是否有命令行工具可以删除whereis返回的所有内容(即使它们是目录)但即使使用部分名称也可以工作(例如,如果我给出字符串,gmai它也会删除名为的文件gmail)。

因此,递归查看所有目录并删除名称中包含字符串的内容。

例如,如果目录被删除,则mail/gmail/sentmail删除下面的所有内容gmail

答案1

如果你真的想这样做,你可以使用这个命令,但您应该先不使用开关进行测试-delete,以测试它是否符合您的预期:

find ./mail -depth -path '*gmai*' -delete

它在所有子目录中递归

在@David Foerster 的评论和我原来的命令的帮助下

答案2

whereis(1)听起来不适合你的目的,因为它不是通用的路径名搜索工具。

没有搜索索引

正如 Gilles 在他的回答中指出的那样,你可以使用find(1)但我想做出一个小而重要的改进1

find [PATH...] -depth -path '*gmai*' -print # -delete

解释:

  • find [PATH...]如果没有给出路径,则遍历每个PATH或当前工作目录下的所有文件和子目录,并打印所有匹配项(默认)。

  • -path PATTERN火柴满的路径反对PATTERN使用通配符(如果有),因此*gmai*匹配所有带有中缀的路径名gmai

  • -delete删除所有匹配的路径(并覆盖打印它们的默认操作)。

  • -depth指示find先匹配子目录,再匹配父目录,即先匹配目录条目,再匹配父目录本身。必须先删除子目录,再删除父目录,因为在 Unix 的文件系统语义中,只有空目录才能被删除。

  • -print打印所有匹配的路径。使用它在实际删除之前检查结果。在命令中添加注释-delete(通过删除#其前面的)以实际删除它们。

搜索索引

如果您要删除的所有位置都出现在mlocate.db(5)搜索索引您可以使用它进行更快的搜索:

locate '/your/parent/path/*gmai*'

搜索所有以中缀开头且其余部分包含中/your/parent/path/缀的(索引)路径。此命令仅列出搜索结果。gmai

要删除结果,请使用:

locate -0 '/your/parent/path/*gmai*' | xargs -r -0 -- rm -rf --

解释:

  • |将左侧命令的输出重定向到右侧命令的输入。

  • xargs从其输入中收集“项目”,将它们附加到给定的命令并运行该命令。

  • -rxargs如果没有输入项则不运行该命令。

  • rm -rf递归删除文件和目录

  • -0指示locate用空字节分隔匹配项并xargs接受以空字符分隔的输入项。这可以避免路径名包含空格(更具体地说是换行符)的问题。


1他在问题重新提出并允许我回答之前就将其纳入了他的回答中。

相关内容