-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。 コマンドでは、 を介してこのパラメータを使用します$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。そのため、実行方法が奇妙であったとしても、効果は必要なようになります。

  • 次に、;2 番目の末尾のがexecエスケープされませんでした。コマンドはforfindなしで終了し、エラーが発生していました。このためすぐに終了したため、出力は生成されませんでした。;execfind

  • 最後にある は\;シェルによって処理されます。通常はステートメントの区切り文字になりますが、エスケープされているため、コマンドとして実行しようとします。当然、これは失敗します。

コマンドを簡略化することを検討してください:

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

関連情報