rm -rf *는 현재 디렉토리의 모든 파일 / 폴더를 제거합니까?


20

윌 rm -rf *현재 디렉토리에있는 모든 파일 / 폴더를 제거? 와일드 카드 *가 상위 디렉토리로 이동하지 않고 모든 파일 시스템이 지워지지 않도록하고 싶습니다. :디

나는 일을 기억 chmod 777 .* -R에 chmod숨김 파일 및 그것은 chmod내 파일 시스템을 모두 에드. 분명히, 나는 루트 계정에 있었다.


1
이것이 내가 rm -rf ./*현재 디렉토리를 명시 적으로 지정하는 이유입니다 ... 그러나 Ankur는 그것이 중요하지 않다고 말합니다.
— mpen

@Mark : ..와 ./ ..의 차이점은 무엇입니까? 당신은 cd ./ ..를 시도하고 당신이 끝나는 곳을 볼 수 있습니다 :)
— Johan

@Johan : 없음 차이 ... 나는 그냥 내 미친 머리에 더 의미 것 같아요 : D
— mpen

@Mark : 쉬운 실수 :)
— Johan

답변:


15

아니요, 쉘을 많이 조정하지 않으면로 시작하는 파일이나 디렉토리가 제거되지 않습니다 .. 그것들을 제거하려면 명시 적으로 나열 할 수 있습니다

rm -rf .file .dir

또는 올바른 glob 패턴을 사용하십시오 (Chris에게 감사합니다)

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

편집은 여기에서 요점은 당신이 사용할 수 없다는 것입니다 .*같은 파일과 일치하기 .file때문에, .*나 .*?또한 일치 ..또는 .. .[^.]*같은 파일과 일치 .file하는 반면, 같은 파일과 ..?*일치합니다 ..foo( *0 개 이상의 문자 ?와 일치하고 정확히 1 개와 일치).


1
..?*".."로 시작하는 항목을 잡는 것과 같은 것도 필요합니다 (예 :) ..foo.
— Chris Johnsen

@ 크리스 : OK, 나는이 까다 롭고 광기를 시작, 당신은 맞다)
— 벤자민 Bannier

"올바른"글로브 패턴을 사용하는 것뿐만 아니라 일치하는 항목의 양도 중요합니다. 대량의 파일이있는 디렉토리에서 쉘은 한 번에 50k 파일을 제공 할 수 없습니다 rm. 따라서 *를 사용하여 디렉토리의 내용을 삭제하는 것이 가장 현명한 방법은 아닙니다.
— akira April

설명 xargs은이 질문의 범위를 약간 벗어난 것 같습니다. 예를 들어 쉘이 인수 목록 길이를 불평 할 때 그것에 대해 생각하기 시작할 수 있습니다.
— Benjamin Bannier

1
OP가 자신의 궁극적 인 문제 / 해결책을 얻는 방법을 확신하지 못하기 때문에 범위를 벗어난 것으로 생각합니다. 디렉토리의 모든 내용을 제거하십시오. OP는 이미 해결책 (나쁜 해결책)을 염두에두고이 해결책으로 문제가 발생하는 이유를 물음으로써 일반적인 "잘못된"일을하고 있습니다. 더 좋은 방법은 "디렉토리 자체를 삭제하지 않고 디렉토리의 모든 파일을 삭제하는 방법"입니다. OP의 솔루션은 globbing 작동 방식의 본질로 인해 문제를 일으킬 것입니다.
— akira

12

디렉토리와 그 내용을 모두 제거 하려면 전체 글 로빙 질문을 무시하고 이름을 기준으로 chdir상위 디렉토리와 rm -rf해당 디렉토리로 이름을 지정할 수 있습니다 . 내용을 제거하고 디렉토리를 유지하려면 모두를 제거한 다음 디렉토리를 다시 작성하는 것이 가장 쉽습니다.

가능한 모든 디렉토리 항목 save와 일치하는 glob을 만드는 것은 복잡합니다. 그리고 ..; * .??*거의 항상 실제로 작동 하는 간단한 답변 (예 :)을 쉽게 얻을 수 있습니다 . 기억하기 쉽고 작동하지 않는 시간을 post-rm로 잡을 수 있기 때문에 대화식으로 사용하는 것이 ls -a좋습니다. 스크립트의 경우 모두 제거를 수행하고 빈 디렉토리를 다시 만드는 것이 더 쉽습니다.


1
그게 내가 제안하는 것입니다 : 디렉토리를 버리고 완료
— akira

답이 아니라도 좋은 생각입니다.
— Johan

10

이 질문은 * 가하는 일 (그리고 rm이 아닌)에 관한 것이므로 다른 접근법을 시도해 봅시다.


*의 기능이 확실하지 않은 경우 먼저 echo와 같은 무해한 명령을 사용하여 "테스트"할 수 있습니다. 당신이 이것을 실행하기 전에, 당신이 당신의 홈 디렉토리에서 그들을 실행하면 그들이 무엇을 보여줄지 추측하십시오.

echo *
echo .*

그러나 먼저 놀이터를 만들어서 별과 놀면서 우리가 무엇을 끝내는지 볼 수 있습니다.

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2

이제이 디렉토리에서 우리는 이것을 가지고 있습니다 :

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2

이제 echo 명령을 사용하여 *가 확장되는 것을 확인하십시오.

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1

rm 명령으로 어떤 일이 발생하는지 봅시다

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1

보시다시피, 그는 file2로만 확장되었으므로 *는 file2로만 확장되었습니다. rm -rf. *를 입력하면 쓰는 것과 동일합니다.

rm -rf . .. .file1

그리고 솔직히 말하면 재미있게 보이지는 않습니다.)

이것이 귀하의 질문의 * 부분을 명확히하기를 바랍니다.


업데이트 : 그러나 Ankur Goel이 지적한 것처럼 rm에 내장 된 보호 기능이 있습니다 (쉘 명령의 경우 비정상적입니다 :)

새로운 놀이터를 만들자 :

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2

이제 우리는 이것을 다시 얻었지만 rm이 rrserk을 시작하면 root로 test1을 소유합니다.

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1

따라서 모든 것을 제거합시다 :

cj@zap:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2

그리고 rm이 제거하지 않은 것 같습니다. 그리고 .. 우리가 그에게 말해도 !!!

따라서이 긴 대답 후에는 다음과 같이 디렉토리의 모든 것을 제거하는 것이 안전합니다.

rm -rf * .*

그러나 rm의 모든 구현이 이와 같이 작동하는지 확실하지 않기 때문에 이것을 조심스럽게 사용합니다!


7

예. rm -rf는 현재 디렉토리의 파일과 폴더 만 삭제하며 파일 트리를 올라가지 않습니다. rm은 심볼릭 링크를 따르지 않고 그들이 가리키는 파일을 삭제하지 않으므로 파일 시스템의 다른 부분을 실수로 정리하지 않습니다.


1

mpez0 및 rm -rf이 특정 폴더 와 같이 한 레벨 위로 이동하지 않으려면 다음을 수행 하여 현재 폴더를 제외 하고 현재 폴더를 제외한 모든 디렉토리 / 파일 에서 작업하는 방법이 있습니다 ....

rm -rf $(ls -A)

물론 디렉토리 / 파일 중 하나에 쉘 IFS특수 변수 (예 : 공백, 탭, 개행) 의 문자 중 하나가 포함 된 경우 먼저 IFS를 변경하고 명령을 실행 한 다음 IFS를 복원 할 수 있습니다.


0

이 답변 에서 논의 된 "너무 많은 인수"문제를 피하면서 전체 폴더를 비우는 훨씬 쉬운 방법 은 단순히 디렉토리 자체를 삭제하고 다시 만드는 것입니다. 심볼릭 링크 디렉토리에있을 때 이것이 올바르게 작동하도록하려면 다음 행을 사용하십시오.

cd ..
rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink
                        # by using readlink, to recreate the linked-to directory
mkdir $(readlink -f yourdir) # recreate the directory to have it empty
cd yourdir

( yourdir대신 대신 사용 $(readlink -f yourdir)하는 경우 원래 위치가 가득 찬 상태에서만 링크를 교체하십시오)


1
이것은 폴더의 inode에 의존하는 것들을 망가 뜨리고 권한, atime / mtime / ctime / btime, 확장 된 속성 및 액세스 제어 목록을 버릴 수 있습니다.
— Daniel Beck

@DanielBeck 감사합니다, 좋은 지적. 궁금하지만, 하드 링크 (어쨌든 강력하게 권장되지 않는 디렉토리)를 제외하고 inode에 어떤 영향을 미치는가? 그러나 권한 등이 중요합니다. 그래서 가장 일반적인 경우에 아마도 하나를 사용해야 합니다 xargs.
— Tobias Kienzler

OS X에는 이동중인 파일 및 폴더를 처리하고 연결을 계속 유지할 수있는 메커니즘이 포함되어 있습니다. 최근 문서 열기 메뉴 에서 가장 눈에 ly니다 . AFAICT는 inode를 사용하여 내부적으로 수행합니다. 더 많은 정보 . 다른 시스템이 GUI 프로그램을위한 API에서 비슷한 것을 구현했다고해도 놀라지 않을 것입니다.
— Daniel Beck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.