Argumento ausente para -exec

Argumento ausente para -exec

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 shcom um comando -ce o parâmetro {}(o findresultado). 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 finda saída de, não a dos comandos executados por -exec. Isso afetaria os comandos executados, -execuma 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 segundo execnão escapou. O findcomando foi encerrado ali sem ;for exec, causando o erro. findsaia 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

informação relacionada