이것이 쉽다는 것을 알지만 해결책을 찾을 수 없는 것 같아서 이것이 나를 미치게 만듭니다. 아! 새 백업을 실행하기 전에 이전 파일을 삭제하도록 스크립트에 find 명령을 추가하기만 하면 됩니다. 정확한 명령을 입력하는 것보다 변수를 통해 제어하는 편이 낫습니다. 변수를 사용하는 대신 스크립트에 명령을 입력하면 해당 명령이 스크립트에서 작동합니다.
FIND="/usr/bin/find"
BUILD="~/"
FINDOPTS="-type f -mtime +3 -exec rm -rf {} \;"
echo $find $BUILD $FINDOPTS
## remove the 2 week old backup
echo "Removing old backups... "
$FIND $BUILD $FINDOPTS
명령 을 그냥 에코하면 $FIND $BUILD $FINDOPTS
내가 입력했을 때와 똑같이 나타납니다. 유일한 차이점은 내가 입력하면 실제로 실행된다는 것입니다.
타이핑이 /usr/bin/find ~/ -type f -mtime +3 -exec rm -rf {} \;
잘 작동합니다.
내가 얻는 오류는 다음과 같습니다.
/usr/bin/find: missing argument to `-exec'
왜 이런지 설명해 줄 수 있는 사람이 있나요? 감사합니다!
답변1
전체적으로 더 나은 솔루션이 있지만 이 스크립트는 다음과 같은 이유로 실패합니다.
FINDOPTS="-type f -mtime +3 -exec rm -rf {} \;"
^
대기할 매개변수는 find
문자입니다 ;
. 왜냐하면 ;
(우연이 아니기 때문에 )반품셸 명령 내에서 이스케이프되어야 하므로 일반적으로 를 입력하는 셸의 명령 끝 구분 기호입니다 \;
. 이제 이 문자를 변수에 넣으면 쉘은 이를 구분 기호로 평가하지 않습니다. 그러므로 그것은캔트탈출했습니다.
변수 없이 오류를 재현합니다.
$ find /etc -exec ls "\;"
find: missing argument to `-exec'
따라서 문자열을 다음으로 바꾸십시오.
FINDOPTS="-type f -mtime +3 -exec rm -rf {} ;"
답변2
find [...] -exec rm
다음을 사용하는 대신 내장 함수를 사용하는 것이 좋습니다.
find [...] -delete
매뉴얼에서:
-delete
Delete found files and/or directories. Always returns true. This executes
from the current working directory as find recurses down the tree. It will
not attempt to delete a filename with a ``/'' character in its pathname
relative to ``.'' for security reasons. Depth-first traversal processing
is implied by this option. Following symlinks is incompatible with this
option.
(그런데 질문의 명령이 제거된다는 것을 알고 계십니까?어느마지막으로 수정한 지 3일 이상 지난 파일 맞죠? )