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.