bash 스크립트에서 find 및 -exec rm을 사용하면 실패하지만 프롬프트에서는 작동합니다.

bash 스크립트에서 find 및 -exec rm을 사용하면 실패하지만 프롬프트에서는 작동합니다.

이것이 쉽다는 것을 알지만 해결책을 찾을 수 없는 것 같아서 이것이 나를 미치게 만듭니다. 아! 새 백업을 실행하기 전에 이전 파일을 삭제하도록 스크립트에 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일 이상 지난 파일 맞죠? )

관련 정보