![-exec 缺少參數](https://rvso.com/image/1127631/-exec%20%E7%BC%BA%E5%B0%91%E5%8F%83%E6%95%B8.png)
這是我要輸入的命令。
find /home/things/backups -mtime +0 -exec echo "{}" >> /home/things/logs/backup.log \; -exec echo "Hourly rotate successful: $(date). {} was deleted." >> /home/things/logs/backup.log; \;
輸出如下。
find: missing argument to `-exec'
;: command not found
它可以很好地建立檔案 backup.log,但該檔案是空的。
答案1
使用:
find /home/things/backups -mtime +0 -exec \
sh -c 'echo "$0" >> /home/things/logs/backup.log; echo "Hourly rotate successful: $(date). $0 was deleted." >> /home/things/logs/backup.log;' {} \;
我們sh
使用指令-c
和參數{}
(find
結果)啟動一個新的 shell。在命令中我們透過使用此參數$0
。
答案2
讓我們稍微重新定位重定向並添加一些換行符號以查看實際運行的內容:
>> /home/things/logs/backup.log \
>> /home/things/logs/backup.log \
find /home/things/backups -mtime +0 -exec echo "{}" \; \
-exec echo "Hourly rotate successful: $(date). {} was deleted.";
\;
您正在重定向
find
的輸出,而不是 執行的命令的輸出-exec
。這會影響執行使用的命令,-exec
因為它們是子進程並繼承開啟的檔案描述符,因此即使您的處理方式很奇怪,效果也將是您所需要的。那麼
;
第二秒結束時的exec
就沒有逃脫。該命令在沒有for 的find
情況下終止,導致錯誤。因此立即退出,因此沒有產生任何輸出。;
exec
find
最後
\;
由 shell 處理。通常,它是一個語句分隔符,但由於它被轉義,它嘗試將其作為命令運行。這自然會失敗。
考慮簡化命令:
find /home/things/backups -mtime +0 -exec \
bash -c 'printf "%s\nHourly rotate successful: $(date). %s was deleted.\n" "$0" "$0"' {} \; \
>> /home/things/logs/backup.log