![Argumento ausente para -exec](https://rvso.com/image/1127631/Argumento%20ausente%20para%20-exec.png)
Este é o comando que estou inserindo.
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; \;
e a saída está abaixo.
find: missing argument to `-exec'
;: command not found
Ele cria o arquivo backup.log corretamente, mas o arquivo está vazio.
Responder1
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 um novo shell sh
com um comando -c
e o parâmetro {}
(o find
resultado). No comando usamos esse parâmetro via $0
.
Responder2
Vamos reposicionar um pouco os redirecionamentos e adicionar algumas quebras de linha para ver o que você está realmente executando:
>> /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.";
\;
Você está redirecionando
find
a saída de, não a dos comandos executados por-exec
. Isso afetaria os comandos executados,-exec
uma vez que são processos filhos e herdam descritores de arquivos abertos, portanto, o efeito seria o que você precisava, mesmo que a maneira como você fez isso fosse estranha.Então o
;
final do segundoexec
não escapou. Ofind
comando foi encerrado ali sem;
forexec
, causando o erro.find
saia imediatamente por causa disso, então nenhuma saída foi produzida.O
\;
final é então processado pelo shell. Normalmente, seria um delimitador de instrução, mas como tem escape, ele tenta executá-lo como um comando. Isso falha, naturalmente.
Considere simplificar o 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