要删除 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
在这两种变体中,:
实用程序都会被正确调用,并且每个找到的路径名(给定搜索路径中或之下的任何常规文件)都会发生重定向。
有关的: