在 find 命令中使用 exec 时出错

在 find 命令中使用 exec 时出错

要删除 Linux 计算机的所有用户的所有电子邮件,我运行:

find /var/spool/mail/ -regextype sed -regex "^.*[^/]$" -exec :> {} \;

...但是我收到以下错误消息:

find: ‘:’: No such file or directory
find: ‘:’: No such file or directory
find: ‘:’: No such file or directory

怎么了?

答案1

在这里使用正则表达式有什么意义?为什么不直接使用呢find /var/spool/mail/ -type f-maxdepth 1如果您想防止递归到任何子目录,请使用。

另外,当您可以删除用户邮箱时,为什么还要截断它们呢?例如

find /var/spool/mail/ -type f -delete

或者

find /var/spool/mail/ -type f -exec rm {} +

当用户收到新邮件时,MTA 或 MDA 将根据需要创建 mbox 文件,并具有正确的所有权和权限。

答案2

您似乎想要截断所有用户的邮箱。您不能通过调用:来执行此操作,find因为:它不是外部实用程序(它是 shell 内置实用程序)。使用true而不是:可以工作,因为它通常可作为外部命令使用,但是......

您也不能在通过执行的命令中使用重定向,-exec因为该重定向将由 shell 在实用程序首次启动时执行find(不是每个找到的文件一次)。

您的命令本质上与

find /var/spool/mail/ -regextype sed -regex "^.*[^/]$" -exec : \; >{}

即,它将创建一个名为的文件{},标准输出流find将重定向到该文件。

相反,你可以做类似的事情

find /var/spool/mail -type f -exec sh -c '
    for pathname do
        : >"$pathname"
    done' sh {} +

作为“一行”:

find /var/spool/mail -type f -exec sh -c 'for pathname do : >"$pathname"; done' sh {} +

或者,如果所有邮箱都紧接在下面/var/spool/mail

for pathname in /var/spool/mail/*; do
    : >"$pathname"
done

作为“一行”:

for pathname in /var/spool/mail/*; do : >"$pathname"; done

在这两种变体中,:实用程序都会被正确调用,并且每个找到的路径名(给定搜索路径中或之下的任何常规文件)都会发生重定向。

有关的:

相关内容