Bash
在 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
怎麼了?
您似乎想要截斷所有使用者的郵箱。您不能通過呼叫
:
fromfind
as:
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 文件。