Fehlendes Argument für -exec

Fehlendes Argument für -exec

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 shmit einem Kommando -cund dem Parameter {}(dem findErgebnis). 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 finddie Ausgabe von um, nicht die der von ausgeführten Befehle -exec. Dies würde sich auf die mit ausgeführten Befehle auswirken, -execda 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 zweiten execnicht maskiert. Der findBefehl wurde dort ohne ein ;for beendet exec, was den Fehler verursachte. findAus 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

verwandte Informationen