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


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.