-exec 缺少參數

-exec 缺少參數

這是我要輸入的命令。

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情況下終止,導致錯誤。因此立即退出,因此沒有產生任何輸出。;execfind

  • 最後\;由 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

相關內容