2014-05-08 3 views
0

rm -rf $TIGER/${LION}/${RABBIT}/* and rm -rf $TIGER/${LION}/${RABBIT} 사이의 차이를 이해하면 스크립트에 넣으면 재앙이 발생하지 않으므로 변수가 설정되지 않은 경우 루트에서 모든 것을 삭제할 수 있습니다. csh/ksh에서 rm -rf를 사용하는 안전한 방법은 무엇입니까?

도움 주셔서 감사합니다.

rm -rf $TIGER/${LION}/${RABBIT}/* 

숨겨진 파일 (일명 파일을 점) : $ {RABBIT} 디렉토리가 삭제되지 않습니다 -

+0

두 가지 질문 - 변수가 설정되지 않은 경우 안전하게 작동하고 두 명령의 차이점을 이해하므로 전혀 상관이 없습니다. –

+0

... 그건 그렇고 - 따옴표는 당신의 친구입니다. 'rm -rf "$ tiger/$ lion/$ rabbit"변수에 공백이 있으면 버그가 적습니다. (변수가 쉘 내장 변수 나 환경 변수가 아니면 소문자 변수 이름을 사용하는 것이 더 일반적입니다. –

+0

...이 명령에는'$ foo'와'$ {foo}'사이에는 아무런 효과가 없습니다. 당신은 아무런 해를 끼치 지 않고 모든 중괄호를 버릴 수 있습니다. –

답변

3

이 반복적으로 아닌 모든 숨김 파일 내부$ {RABBIT} 디렉토리를 삭제 .으로 시작하는 파일 이름이 있습니다. 셸 dotglob 옵션을 설정하지 않는 한 이 아니고 일반 * 확장과 일치합니다.

그래서 당신이 이렇게 shopt을 사용할 수 (숨겨진 파일 포함) 모든 파일을 삭제합니다 :

shopt -s dotglob     # turns shell option dotglob ON 
rm -rf $TIGER/${LION}/${RABBIT}/* # Now deletes all (including hidden) files 
shopt -u dotglob     # FYI - unsets or turns dotglob OFF 

이 반복적으로 $ {RABBIT} 디렉토리를 포함한 모든 을 삭제합니다.

rm -rf $TIGER/${LION}/${RABBIT} 
+1

glob 표현식에서 숨김 파일을 제외시키는 쉘의 지원이 비활성화되어 있지 않으면 모든 것이 아닙니다. –

+0

Charles 님이 귀하의 유익한 의견에 대해 답변했습니다. – suspectus

7

변수가 모두 설정되지 않은 경우 해당 명령으로 인해 재난이 발생합니다. 그들은 디렉토리 자체 또는 숨겨진 내용이 아닌 디렉토리 만 삭제합니다.

명시 적, 루트 디렉토리에서 반복적으로 삭제에 대해 안전 할 경우 테스트 및 취소하려면 :

[[ $TIGER && $LION && $RABBIT ]] || { 
    echo "TIGER, LION and RABBIT must all be set; script exiting" 
    exit 1 
} 
rm -rf ... 
0

퍼팅/* 마지막에 그 디렉토리

동안 내부 내용을 삭제합니다 "/"만이 디렉토리 자체와 내용을 삭제합니다.

관련 문제