배포 스크립트의 일부로 임시 디렉토리에서 캐시 된 항목을 덤프하려고합니다. 나는 다음과 같은 명령을 사용한다 :
rm /tmp/our_cache/*
그러나 /tmp/our_cache
비어있는 경우 (테스트 서버에 많은 변경 사항을 빠르게 연속적으로 적용 할 때 일반적으로 발생) 다음과 같은 오류 메시지가 표시됩니다.
rm: cannot remove `/tmp/our_cache/*': No such file or directory
큰 문제는 아니지만 조금 추한 것이므로이 스크립트의 출력에서 잡음 대 신호 비율을 줄이려고합니다.
디렉토리가 이미 비어 있다고 불평하는 메시지를받지 않고 디렉토리의 내용을 삭제하는 유닉스의 간결한 방법은 무엇입니까?
답변
메시지를 표시하지 않고 모든 파일을 제거하고 싶을 때 -f
스위치를 사용하여 rm
존재하지 않는 파일을 무시 하는 이유는 무엇입니까?
rm -f /tmp/our_cache/*
매뉴얼 페이지에서 :
-f, --force
ignore nonexistent files, never prompt
또한 서브 디렉토리가있을 수 있으며 해당 서브 디렉토리 /tmp/our_cache/
및 해당 컨텐츠도 삭제하려는 경우 -r
스위치를 잊지 마십시오 .
답변
find /tmp/our_cache/ -mindepth 1 -delete
편집 1
“타입 f 제거
편집 2
-mindepth 1
검색 루트 디렉토리가 제거되지 않도록하기 위해 비표준 옵션 을 추가했습니다 ( -type f
제한을 제거한 후 ).
답변
/dev/null
이것을 인쇄하지 않도록 표준 오류를 리디렉션 할 수 있습니다
$ rm /tmp/our_cache/* 2>/dev/null
답변
다른 방법 (약간 과도하지만 …) :
[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*
이 사용 test
또는 [
테스트에 문자열은 실행에서 반환하는 경우 ls
디렉토리에이 비어 있지 않습니다. 그런 다음 해당 문자열이 비어 있지 않은 경우에만 디렉토리 아래의 모든 항목을 제거합니다.
참고 : glob를 제외하면 ls
파일이 없다는 오류가 표시되지 않습니다.
답변
스크립트가 BASH를 사용하는 경우 다음을 시도 할 수 있습니다.
if test "$(ls /tmp/our_cache/)" != ""; then rm /tmp/our_cache/*; fi
“실제”문제가 있거나 파일이 보호 된 경우 ( 이러한 유형의 파일을 삭제하려면 -f
수정자가 필요함 rm
) 여전히 오류가 발생하지만 파일이 없을 때 오류가 발생하지 않습니다.
zsh, ksh와 같이 스크립팅에 BASH 이외의 다른 쉘을 사용하는 경우보다 이식성이 좋은 다른 구문을 사용해 볼 수 있습니다.
if [[ "$(ls /tmp/our_cache/)" != "" ]]; then rm /tmp/our_cache/*; fi