似乎这个问题已经以多种方式被问到。但我想用rm
而不是find
。
我遵循了许多有关如何使用的解释find
,但在执行命令时遇到了问题find
。当我使用locate时,我得到了以下输出:
maxgitt@mgpc:/etc$ locate omero
/etc/nginx/conf.d/omeroweb.conf
/etc/rc0.d/K01omero-web
/etc/rc1.d/K01omero-web
/etc/rc2.d/S03omero-web
/etc/rc3.d/S03omero-web
/etc/rc4.d/S03omero-web
/etc/rc5.d/S03omero-web
/etc/rc6.d/K01omero-web
但是当我尝试使用 find 删除相应的文件时,出现以下错误。
maxgitt@mgpc:/etc$ find -type f -name '*omero*'
./etc/rc0.d/K01omero-web
./etc/rc1.d/K01omero-web
./etc/rc2.d/S03omero-web
./etc/rc3.d/S03omero-web
./etc/rc4.d/S03omero-web
./etc/rc5.d/S03omero-web
./etc/rc6.d/K01omero-web
find: ‘./cups/ssl’: Permission denied
find: ‘./ppp/peers’: Permission denied
find: ‘./polkit-1/localauthority’: Permission denied
find: ‘./ssl/private’: Permission denied
./nginx/conf.d/omeroweb.conf
find: ‘./chatscripts’: Permission denied
find: ‘./docker’: Permission denied
因此我选择使用以下命令:
maxgitt@mgpc:/etc$ sudo rm -rf /etc/*/*omero-web*
但我希望能够删除etc/
目录及其相应子目录中的所有文件。由于我的 hackrm
命令,我只剩下一个文件:
maxgitt@mgpc:/etc$ locate omero
/etc/nginx/conf.d/omeroweb.conf
答案1
使用 sudo
在删除之前一定要先进行一次试运行,以确保删除的内容没有超出预期。
sudo find -type f -name '*omero*'
然后,假设列表看起来不错
sudo find -type f -name '*omero*' -delete
或指定要搜索的位置(您已经知道这些文件位于 /etc 中)
sudo find /etc -iname '*omero*' -delete
-delete 比-exec rm {} \;
或更快,-print0 | xargs -0 rm
因为它不必产生另一个进程。
编辑:来自评论
for i in $(locate omero) ; do rm $i ; done
答案2
您只需将其添加sudo
到您的命令中:
sudo find /etc -type f -name '*omero*' -delete
错误就会消失。原因是这些文件归组和 root 用户所有root user
,并且只能由他们删除。sudo
答案3
使用 find 而不是 rm 的原因有很多。特别是如果您的 find 版本支持“-delete”选项:
- 如果您的文件名包含空格或换行符,您的
rm
命令将不起作用,甚至可能会删除错误的文件。 - 如果要删除的文件很多,命令将因超出最大命令行长度而失败。
如果你的 find 支持“-delete”:
find -type f -path "*omero*" -delete
如果您的查找不支持“-delete”并且需要起始路径:
find . -type f -path "*omero*" -print0 | xargs -0 rm
' -print0
... -0
' 很重要。这告诉 find 输出以 NUL 分隔的文件名,而 xargs -0 将期望以 NUL 分隔的文件名。这样,文件名中的空格和换行符就不会引起问题。
另外,我使用-path
而不是-name
来更接近“locate”给出的结果。但是,这意味着如果文件恰好位于包含“omero”的目录下,则该文件将被删除。这可能不是您想要的,您应该使用-name
而不是 。
解决了这个问题后,如果您确定最终结果是什么,请将其放在sudo
第一个版本的前面。或者sudo
放在两个版本的前面find
以及xargs
第二个版本的前面。