-exec에 대한 인수가 누락되었습니다.

-exec에 대한 인수가 누락되었습니다.

이것이 내가 입력하는 명령입니다.

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

출력은 아래와 같습니다.

find: missing argument to `-exec'

;: command not found

backup.log 파일이 생성되지만 파일이 비어 있습니다.

답변1

사용:

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

sh명령 -c과 매개변수 {}( 결과)를 사용하여 새 셸을 시작합니다 find. 명령에서는 를 통해 이 매개변수를 사용합니다 $0.

답변2

리디렉션의 위치를 ​​약간 변경하고 줄 바꿈을 추가하여 실제로 실행 중인 내용을 살펴보겠습니다.

 >> /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.";
   \;
  • find에서 실행하는 명령의 출력이 아니라 의 출력을 리디렉션하고 있습니다 -exec. 이는 자식 프로세스이고 열린 파일 설명자를 상속하기 때문에 사용하는 명령 실행에 영향을 미치므로 -exec, 방법이 이상하더라도 효과는 필요한 것입니다.

  • 그런 다음 ;두 번째 끝의 exec이스케이프되지 않았습니다. for 없이 명령 find이 종료되어 오류가 발생했습니다. 이로 인해 즉시 종료되었으므로 출력이 생성되지 않았습니다.;execfind

  • 마지막 \;에는 쉘에 의해 처리됩니다. 보통은 문 구분 기호가 되지만 이스케이프 처리되었기 때문에 명령으로 실행하려고 합니다. 당연히 실패합니다.

명령을 단순화하는 것을 고려하십시오.

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

관련 정보