rm -rf 모든 파일과 모든 숨겨진 파일없이. & .. 오류


82

rm -rf /some/path/* 해당 디렉토리 (및 하위 디렉토리)에서 숨겨지지 않은 모든 파일을 삭제합니다.

rm -rf /some/path/.* 해당 디렉토리에있는 모든 숨겨진 파일 (하위 디렉토리는 아님)을 삭제하고 다음과 같은 오류 / 경고를 제공합니다.

rm: cannot remove directory: `/some/dir/.'
rm: cannot remove directory: `/some/dir/..'

에 대해 경고 / 오류가 발생하지 않고 대상 디렉토리에있는 모든 숨겨진 비 숨김 파일 및 재귀 적 폴더를 제거하는 적절한 방법은 무엇입니까 .와는 ..?

답변:


39

항상 오류 메시지를 보낼 수 있습니다 /dev/null

rm -rf /some/path/.* 2> /dev/null

당신은 또한

rm -rf /some/path/
mkdir /some/path/

... 먼저 숨겨진 파일을 신경 쓸 필요가 없습니다.


2
그러나 숨겨진 파일 만 삭제하려면 어떻게해야합니까?
CMCDragonkai

@CMCDragonkai는 다른 질문이어야하지만 Gilles의 답변에서 해결책을 찾을 수 있습니다 ( rm ..?* .[!.]*해야합니다).
evilsoup

15
디렉토리를 삭제하고 다시 작성하지 않으면 파일 권한이 이후에 적절하지 않을 위험이 있습니다 (특히 서버 환경에서 중요 함). 이전과 동일한 권한을 가진 폴더를 누가 자동으로 만들 수 있습니까?
Yo Ludke

1
@YoLudke 당신은 절대적으로 정확합니다. 많은 상황에서 폴더를 삭제하고 다시 만드는 것은 의미 적으로 해당 폴더를 비우는 것과 동일하지 않습니다. 그러니 조심하세요!
Thomas

디렉토리 삭제가 항상 가능한 것은 아닙니다. 필자의 경우 디렉토리는 도커 볼륨이며 볼륨 내에서 원하는 것을 할 수는 있지만 컨테이너 내에서 볼륨 자체를 변경할 수는 없습니다.
dovidweisz

85

*모든 비점 파일과 .[!.]*일치하고 ., 파일을 제외한 모든 점 파일 과 이름이로 시작하는 파일 ....?*일치 하고 ,를 제외한 모든 점 파일 과 일치합니다 ... 함께 .및 이외의 모든 파일을 찾습니다 ... 이 세 가지 패턴 중 어느 것도 일치하지 않으면 자체로 확장됩니다. rm -f존재하지 않는 인수에 대해서는 신경 쓰지 않으므로 중요하지 않습니다.

rm -rf ..?* .[!.]* *

을 사용할 수도 있습니다 find. 이것은 더 복잡하지만 위의 와일드 카드가 시스템의 명령 행 길이 제한을 초과하여 확장 할 수있는 파일이 너무 많아도 작업 할 수있는 이점이 있습니다.

find . -name . -o -prune -exec rm -rf -- {} +

디렉토리를 제거하고 다시 작성하는 것이 더 명확 할 수 있습니다. 이것은 다른 프로그램이 원래 디렉토리에 파일을 동시에 작성하더라도 디렉토리가 비어있는 장점이 있습니다 (또는 경우에 따라 단점).


8
부모의 통과 및 삭제를 방지하므로 허용되는 답변이어야합니다.
rbellamy 2016 년

find대안은 일부 파일이 성공적으로 삭제되지 않은 경우에도 "성공"을 반환; 스크립트에는 좋지 않습니다.
Franklin Yu

두 번째에 관해서 find명령, 상태를 찾기 위해 맨 "-delete이 -depth 의미하기 때문에, 당신은 유용하게 -prune 사용과 함께 -delete 수 없습니다." 아직 사용하고 -prune -delete있습니까?
Doktor J

@DoktorJ 실제로, -prune여기서 아무것도하지 않습니다. 그리고 다시 읽었을 때 나는 질문에 올바르게 대답하지 않았다는 것을 알았습니다. 나는 재귀하지 않도록 조심했지만 질문은 명시 적으로 재귀 삭제를 요구합니다. 내 대답을 수정했습니다.
Gilles

2
@haylem zsh을, 당신은 쓸 필요가 .[^.]*대신 .[!.]*zsh을이 구문 분석하기 때문에, 역사 치환은 (기본적으로 스크립트에서 대화 형이 아닌 경우이다)을 사용하는 경우 !역사 참조한다. 그러나 zsh에서는 처음에는 필요하지 않을 것 입니다. 와일드 카드 일치에 *(D)도트 파일 ( .또는 없이 ..) 을 포함 하는 데 사용할 수 있습니다 .
Gilles

21

이것이 대부분의 Linux 배포판에서 가장 편리한 방법이라는 것을 깨달았습니다.

ls -A1 | xargs rm -rf

어디

-A= 모든 목록 제외를 . 하고..

-1 = 모든 항목을 한 줄에 넣습니다.


4
내가 보는 단점은이 작업을 수행하려면 디렉토리에 'cd'가 필요하다는 것입니다.
kumar

ls -A1 /your/path/ | xargs rm -rf적용
godzillante

nope..it가 도움이되지 않습니다-예 : ls -A1 ~ / test / | xargs rm -rf이 명령은 ~ / test 디렉토리에서 현재 'cd into'파일을 삭제합니다.
kumar

5
파일 이름에 공백, 줄 바꿈, 따옴표 또는 백 슬래시가 포함되어 있으면 작동하지 않습니다.
Stéphane Chazelas 2016 년

1
-1 위의 의견 때문에. ↑↑↑↑↑↑↑↑
뭔가

15

dotglob쉘 의 옵션을 변경하고을 사용 *하거나 다음과 같은 것을 사용하십시오 find.

find somedir -mindepth 1 -delete

2
또는 간단하게 rm -rf /some/dir새 빈 디렉토리를 만들 수 있습니다.
tripleee

지금까지 가장 좋은 옵션. 디렉토리 경로를 명시 적으로 지정하기 때문에 매우 안전합니다.
야닉 지루 아드

4

이것은 @ Giles 답변과 동일하게 작동하지만 더 컴팩트합니다.

rm -rf {,.[!.],..?}*

또는

rm -rf dir/to/files/{,.[!.],..?}*

if안전을 위해 스크립트에서 사용법을 추가해야 합니다.

if [ -d "$DIR" ]; then
    rm -rf ${DIR}/{,.[!.],..?}*
fi

1
이상하게도 Ubuntu 16.04 LTS의 bash 별칭으로 이전 답변이 작동하지 않았습니다. 그러나 alias cleandir='rm -rf {,.[!.],..?}*'그렇지 않습니다.
Steven Ventimiglia

3

친구를 찾으십시오.

find ! -name '.' ! -name '..' -delete

% find ! -name '.' ! -name '..'
./test
./test4
./test4/.test6
./test3
./.test5
./test2
% find ! -name '.' ! -name '..' -delete    
% find ! -name '.' ! -name '..'     
%             

재귀 적으로 현재 디렉토리 ($ PWD) 이외의 것을 검색하려면 find명령 바로 뒤에 경로를 추가하십시오 . 예를 들어, find /path ! -name '.' ! -name '..' -delete. n여러 디렉토리 만 내림차순으로 -maxdepth n하려면 /path매개 변수 바로 뒤에있는 옵션 을 사용하십시오 .

위 명령은 Ubuntu 13.04 시스템에서 테스트되었습니다. 다른 최신 리눅스 시스템에서도 작동 할 것입니다.


현재 디렉토리의 모든 디렉토리를 삭제하려면find . ! -name '.' ! -name '..' -type d -delete
Andy

2

에 대한 경고 / 오류를받지 않고 대상 디렉토리에서 숨겨진 모든 파일과 폴더를 재귀 적으로 제거하는 올바른 방법은 무엇입니까? 그리고 ..?

문제의 디렉토리입니다 가정 ./dir한 후,

rm -rf ./dir

./dir숨겨진 파일과 디렉토리를 포함하여 재귀 적으로 ./dir디렉토리 자체를 포함하여의 모든 파일을 제거 합니다.

디렉토리 자체를 삭제하지 않으려면 나중에 다시 생성하거나 사용하십시오.

find ./dir -mindepth 1 -delete

또는 당신이 경우 find지원하지 않습니다 -delete,

find ./dir -mindepth 1 -depth -exec rm -rf {} ';'

를 사용 -mindepth 1하면 최상위 디렉토리를 유지할 수 있습니다 ./dir.


이것은 최고의 답변으로 표시되어야합니다
kitingChris

1

나는 당신이 실험을 제안합니다

ON (숨김 파일)

  • 세트 dotglob

    shopt -s dotglob

OFF

  • 설정 해제 dotglob

    shopt -u dotglob

나는이 방법은 정확하게 일을 바란 A에 대한 복사 숨겨진 디렉토리 누락 된 명령.

    shopt -s    dotglob
    cp    -rvn  ./$from/*  ./$too/
    shopt -u    dotglob

그래서 나는 제거 (삭제)를하고 죄송합니다 ...

    shopt -s    dotglob
    rm -fr ../message_splitter--044a/*
    shopt -u    dotglob

... 그것도 작동합니다!

나에게 발생 당신이 사랑하는 판독기 볼 수없는 message_splitter디렉토리를. 어떤 식 으로든 .svn폴더를 제거하고 복사해야하는 폴더가 있습니다.

에서 man페이지 ...

dotglob 설정되면, bash는`. '로 시작하는 파일 이름을 포함합니다. 경로 이름 확장 결과.

참고 문헌 :


-2

이 코드를 사용해보십시오 :

Dirlist=``find /some/path/ -type d -name '.[^.]*'`
for HiddenDir in $Dirlist
do
    rm -rf $HiddenDir
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.