이미 비어있는 경우 오류없이 디렉토리의 파일 삭제 적용 할 때

배포 스크립트의 일부로 임시 디렉토리에서 캐시 된 항목을 덤프하려고합니다. 나는 다음과 같은 명령을 사용한다 :

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


답변