递归删除使用定位找到的相同文件

递归删除使用定位找到的相同文件

似乎这个问题已经以多种方式被问到。但我想用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第二个版本的前面。

相关内容