为什么不找到/ rm -iname'* phpmyadmin'删除phpMyAdmin-Version-XYZ.zip?


8

我有以下代码:

find ./ -iname '*phpmyadmin' -exec rm -rf {} \;

它删除名为的目录phpmyadmin,但不会删除名为的文件phpMyAdmin-Version-XYZ.zip

即使删除了-rf,它也仍然不会删除(可能是因为-iname的第二个问题不影响大小写不敏感)。

  1. 有没有办法删除单个rm(文件,目录,软链接)中的任何inode?
  2. 为什么添加-iname无效?

注意:我没有在中找到“删除任何inode”参数man rm


1
如果您find支持,请尝试-delete操作。(另请参见gnu.org/software/findutils/manual/html_node/find_html/…,详细讨论了许多错误执行此操作的方法。)
zwol

Answers:


31

问题是您正在使用pattern 匹配以phpmyadmin不区分大小写)结尾的文件*phpmyadmin。要获取任何包含字符串的文件phpmyadmin(不区分大小写),请使用-iname '*phpmyadmin*'

find ./ -iname '*phpmyadmin*' -exec rm -rf {} \;

也许在删除之前获取匹配的文件是理智的:

find ./ -iname '*phpmyadmin*'

要回答您的第一个问题,rm用户空间中没有处理inode的选项。


1
可能应该考虑一下,-depth以便find不要尝试递归到刚刚删除的目录中。
roaima

8
不要从答案中删除任何内容,答案中确实包括此内容,而只是想强调一下,OP的命令没有删除 zip文件的原因是由于找不到尾随的'* ,所以找不到它'上的图案。
Gwyn Evans

3
@GwynEvans这也意味着OP find在添加-exec参数之前没有测试过。非常危险。
图兰斯·科尔多瓦

可能会建议-exec rm -rf {} +-没有理由对rm每个文件运行一个文件造成性能损失。
查尔斯·达菲

2
find ./ -iname '*phpmyadmin*' -exec /usr/lib/klibc/bin/nuke {} +

即使有人创建了-phpmyadmin目录,此方法也有效。


查找(至少在这里)在名称之前加上./,因此不需要:它将执行rm -rf ./-phpmyadmin,它可以与任何理智的东西一起使用rm。尝试find ./ -iname '*whatever*' -exec echo '{}' ';'测试
derobert

@derobert:在很多场合我都搞砸了。一朝被蛇咬十年怕井绳。也许只有在要查找的参数类似于“ -annoyingdirectoryname”的情况下才会发生。
约书亚记

1
如果有人跑了,说find */而不是find .,那会做到的(如果匹配的目录名称以短划线开头)。就是说,我倾向于建议通过在参数之前--提供显式的选项结束来处理此类情况。(请参阅POSIX实用程序语法准则中的#10 )。{}
查尔斯·达菲

1
顺便说一句- {} +比效率更高{} \;,因为它将只运行命令的nuke所有实例(在这种情况下)以适应命令行上找到的所有项目,而不是每个实例。
查尔斯·达菲

@CharlesDuffy如果他们运行了,find */那么问题不会在中出现-exec,带有连字符的目录似乎是一个find选择,并且会抱怨。
巴马尔(Barmar)'17年
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.