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


31

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

rm /tmp/our_cache/*

그러나 /tmp/our_cache비어있는 경우 (테스트 서버에 많은 변경 사항을 빠르게 연속적으로 적용 할 때 일반적으로 발생) 다음과 같은 오류 메시지가 표시됩니다.

rm: cannot remove `/tmp/our_cache/*': No such file or directory

큰 문제는 아니지만 조금 추한 것이므로이 스크립트의 출력에서 ​​잡음 대 신호 비율을 줄이려고합니다.

디렉토리가 이미 비어 있다고 불평하는 메시지를받지 않고 디렉토리의 내용을 삭제하는 유닉스의 간결한 방법은 무엇입니까?

답변:


48

메시지를 표시하지 않고 모든 파일을 제거하고 싶을 때 -f스위치를 사용하여 rm존재하지 않는 파일을 무시 하는 이유는 무엇입니까?

rm -f /tmp/our_cache/*

매뉴얼 페이지에서 :

-f, --force
          ignore nonexistent files, never prompt

또한 서브 디렉토리가있을 수 있으며 해당 서브 디렉토리 /tmp/our_cache/및 해당 컨텐츠도 삭제하려는 경우 -r스위치를 잊지 마십시오 .


3
가장 명백한 해결책과 나는 그것에 대해 생각하지 않았다! 이 만화의 첫 번째 남자 인 것 같습니다 xkcd.com/399 ;-)
Huygens

6
find /tmp/our_cache/ -mindepth 1 -delete

편집 1

"타입 f 제거

편집 2

-mindepth 1검색 루트 디렉토리가 제거되지 않도록하기 위해 비표준 옵션 을 추가했습니다 ( -type f제한을 제거한 후 ).


참고로, -type f임시 디렉토리도있을 수 있기 때문에 나갈 것입니다 (질문에있는 예가 해당 디렉토리를 설명하지는 않았지만 아마도 없을 수도 있습니다 ...)
Izkata

1
를 사용 -type f하면 일반 파일 만 삭제되므로 심볼릭 링크는 삭제되지 않습니다.
Huygens

@rush 죄송합니다. 확인하지는 않았지만 디렉토리를 언급하지 않고 "파일 삭제"라는 매뉴얼 페이지를 살펴 보았습니다. 내 의견을 삭제합니다.
Hauke ​​Laging

1
그것은 /tmp/our_cache당신도 할 수 있도록 제거합니다 rm -r /tmp/our_cache. 비표준 옵션을 사용하는 동안을 사용할 수 있습니다 -mindepth 1. 와 반대로 rm /tmp/our_cache/*하위 디렉토리와 해당 내용 및 숨겨진 파일도 제거합니다.
Stéphane Chazelas

2

/dev/null이것을 인쇄하지 않도록 표준 오류를 리디렉션 할 수 있습니다

$  rm /tmp/our_cache/* 2>/dev/null

2
예를 들어 파일이 사용 중이기 때문에 파일을 삭제할 수없는 경우 표시되는 오류를 억제하지 않습니까? 억제하려는 유일한 오류는 대상 디렉토리가 비어있는 경우 표시되는 오류입니다. 이것은 원치 않는 부작용이있는 것처럼 보입니다.
Mark Amery

일부 프로세스가 열린 일부 파일을 삭제하려고해도 오류가 발생하지 않습니다.
pradeepchhetri

1

다른 방법 (약간 과도하지만 ...) :

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

이 사용 test또는 [테스트에 문자열은 실행에서 반환하는 경우 ls디렉토리에이 비어 있지 않습니다. 그런 다음 해당 문자열이 비어 있지 않은 경우에만 디렉토리 아래의 모든 항목을 제거합니다.

참고 : glob를 제외하면 ls파일이 없다는 오류가 표시되지 않습니다.


-1

스크립트가 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.