Bash

在 find 命令中使用 exec 時出錯

  • September 9, 2019

要刪除 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

怎麼了?

您似乎想要截斷所有使用者的郵箱。您不能通過呼叫:from findas :is not an external utility(它是一個 shell 內置實用程序)來做到這一點。使用true代替:會起作用,因為它通常可作為外部命令使用,但是……

您也不能在通過執行的命令中使用重定向,-exec因為該重定向將在find實用程序首次啟動時由 shell 執行(不是每個找到的文件一次)。

你的命令本質上是一樣的

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

在這兩種變體中,該:實用程序都被正確呼叫,並且將為每個找到的路徑名(給定搜尋路徑中或之下的任何正常文件)進行重定向。

有關的:

在這裡使用正則表達式有什麼意義?為什麼不直接使用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 文件。

引用自:https://unix.stackexchange.com/questions/539644