![-exec에 대한 인수가 누락되었습니다.](https://rvso.com/image/1127631/-exec%EC%97%90%20%EB%8C%80%ED%95%9C%20%EC%9D%B8%EC%88%98%EA%B0%80%20%EB%88%84%EB%9D%BD%EB%90%98%EC%97%88%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
이것이 내가 입력하는 명령입니다.
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
이 종료되어 오류가 발생했습니다. 이로 인해 즉시 종료되었으므로 출력이 생성되지 않았습니다.;
exec
find
마지막
\;
에는 쉘에 의해 처리됩니다. 보통은 문 구분 기호가 되지만 이스케이프 처리되었기 때문에 명령으로 실행하려고 합니다. 당연히 실패합니다.
명령을 단순화하는 것을 고려하십시오.
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