![-exec への引数がありません](https://rvso.com/image/1127631/-exec%20%E3%81%B8%E3%81%AE%E5%BC%95%E6%95%B0%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93.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
。 コマンドでは、 を介してこのパラメータを使用します$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
なしで終了し、エラーが発生していました。このためすぐに終了したため、出力は生成されませんでした。;
exec
find
最後にある は
\;
シェルによって処理されます。通常はステートメントの区切り文字になりますが、エスケープされているため、コマンドとして実行しようとします。当然、これは失敗します。
コマンドを簡略化することを検討してください:
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