是否有命令行工具可以删除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
从其输入中收集“项目”,将它们附加到给定的命令并运行该命令。-r
xargs
如果没有输入项则不运行该命令。rm -rf
递归删除文件和目录-0
指示locate
用空字节分隔匹配项并xargs
接受以空字符分隔的输入项。这可以避免路径名包含空格(更具体地说是换行符)的问题。
1他在问题重新提出并允许我回答之前就将其纳入了他的回答中。