Dies ist der Befehl, den ich eingebe.
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; \;
und die Ausgabe ist unten.
find: missing argument to `-exec'
;: command not found
Die Datei „backup.log“ wird zwar ordnungsgemäß erstellt, ist aber leer.
Antwort1
Verwendung:
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;' {} \;
Wir starten eine neue Shell sh
mit einem Kommando -c
und dem Parameter {}
(dem find
Ergebnis). Im Kommando verwenden wir diesen Parameter über $0
.
Antwort2
Lassen Sie uns die Weiterleitungen etwas neu positionieren und einige Zeilenumbrüche hinzufügen, um zu sehen, was Sie tatsächlich ausführen:
>> /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.";
\;
Sie leiten
find
die Ausgabe von um, nicht die der von ausgeführten Befehle-exec
. Dies würde sich auf die mit ausgeführten Befehle auswirken,-exec
da es sich dabei um untergeordnete Prozesse handelt und diese offene Dateideskriptoren erben. Der Effekt wäre also der gewünschte, auch wenn Sie dabei seltsam vorgegangen sind.Dann wurde das
;
am Ende des zweitenexec
nicht maskiert. Derfind
Befehl wurde dort ohne ein;
for beendetexec
, was den Fehler verursachte.find
Aus diesem Grund wurde sofort beendet, sodass keine Ausgabe erzeugt wurde.Das
\;
am Ende wird dann von der Shell verarbeitet. Normalerweise wäre es ein Anweisungstrennzeichen, aber da es maskiert ist, versucht sie, es als Befehl auszuführen. Dies schlägt natürlich fehl.
Erwägen Sie eine Vereinfachung des Befehls:
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