Falta argumento para -exec

Falta argumento para -exec

Este es el comando que estoy ingresando.

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; \;

y la salida está a continuación.

find: missing argument to `-exec'

;: command not found

Crea el archivo backup.log bien, pero el archivo está vacío.

Respuesta1

Usando:

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;' {} \;

Iniciamos un nuevo shell shcon un comando -cy el parámetro {}(el findresultado). En el comando usamos este parámetro vía $0.

Respuesta2

Reposicionemos un poco las redirecciones y agreguemos algunos saltos de línea para ver qué estás ejecutando realmente:

 >> /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.";
   \;
  • Estás redirigiendo findla salida de , no la de los comandos ejecutados por -exec. Esto afectaría los comandos que se ejecutan, -execya que son procesos secundarios y heredan descriptores de archivos abiertos, por lo que el efecto sería el que necesitaba incluso si la forma en que lo hizo fuera extraña.

  • Luego ;al final del segundo execno se escapó. El findcomando terminó allí sin un ;for exec, lo que provocó el error. findse cerró inmediatamente debido a esto, por lo que no se produjo ningún resultado.

  • El shell procesa el \;final. Por lo general, sería un delimitador de declaración, pero como tiene carácter de escape, intenta ejecutarlo como un comando. Esto falla, naturalmente.

Considere simplificar el comando:

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

información relacionada