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


20

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

나는 일을 기억 chmod 777 .* -Rchmod숨김 파일 및 그것은 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.