![Falta argumento para -exec](https://rvso.com/image/1127631/Falta%20argumento%20para%20-exec.png)
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 sh
con un comando -c
y el parámetro {}
(el find
resultado). 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
find
la salida de , no la de los comandos ejecutados por-exec
. Esto afectaría los comandos que se ejecutan,-exec
ya 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 segundoexec
no se escapó. Elfind
comando terminó allí sin un;
forexec
, lo que provocó el error.find
se 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