실수로 rm -rf / *를 방지하려면 어떻게해야합니까?


164

방금 rm -rf /*실수로 달렸 지만 rm -rf ./*슬래시 다음에 별표를 나타냅니다.

alias rm='rm -i'그리고 --preserve-root기본적으로 저를 저장하지 않았기 때문에 이에 대한 모든 자동 안전 장치가있다?


나는 뿌리를 내리지 않고 명령을 즉시 취소했지만 내 Bash 프롬프트가 이미 깨져 있음을 알았 기 때문에 어딘가에 어떤 완화 된 권한이있었습니다. 나는 권한에 의존하고 루트 sudo가 아닌 것을 원치 않으며 (와 같은 실수를 할 수 있음 ) 시스템의 어딘가에 하나의 파일이 없기 때문에 신비한 버그를 찾고 싶지 않기 때문에 백업 및 sudo좋습니다. 이 특정 사례에 더 나은 것을 원합니다.


두 번 생각하고 뇌를 사용하는 것에 대해. 나는 실제로 그것을 사용하고 있습니다! 그러나 10 가지 다른 복잡한 프로그래밍 작업을 해결하기 위해 사용하고 있습니다. 나는이 작업에 깊이 빠져 있습니다. 플래그와 경로를 확인하는 데 필요한 두뇌 능력이 없으며 명령과 인수로 생각조차하지 않습니다. 나는 '빈 현재 디렉토리'와 같은 행동의 관점에서 생각합니다. 내 두뇌의 다른 부분은 그것들을 명령으로 번역하고 때로는 실수를합니다. 나는 컴퓨터가 적어도 위험한 것들을 수정하기를 원합니다.


13
참고로, 당신은 또한 당신이 있던 디렉토리를 rm -rf . /mydir대신 rm -rf ./mydir하고 죽일 수 있습니다 . 나는 이것이 더 자주 발생 한다는 것을 알았습니다.
user606723

27
총기의 비유를 사용하기 위해,이 질문은 총이 내가 발을 겨냥하고 발사하지 않고 있다는 것을 인식하게한다고 말하지만, 먼저 총을 내 발에 겨냥하지 않을 책임이 없다고 말합니다. 총과 컴퓨터는 어리 석고 바보 같은 일을하면 이러한 결과를 얻을 수 있습니다. 총의 비유를 따르면, 경계와 연습을 제외하고는 자신을 다치게하는 것이 없습니다.
slillibri

73
@slillibri rm총이 아닌 것을 제외하고 는 컴퓨터 프로그램이므로 사용자가 중요한 파일을 삭제하고 경고를 발행 한다는 것을 알기에 충분히 현명 할 있습니다 (실제로 rm -rf /별 을 쓰려고 시도하지 않는 경우와 마찬가지로 ).
Valentin Nemcev

80
@slillibri Guns는 안전합니다. 온 더 탈출에 필요한데을 넣어하는 방법을 묻는 rm명령은 완벽하게 합법적 인 시스템 관리자의 문제이다.
Gilles

21
sudo rm / bin / rm은 권장되지 않지만 대부분의 rm을 막을 수 있습니다 :-)
Paul

답변:


220

내가 따르는 트릭 중 하나 #rm명령 을 사용하는 동안 처음부터 시작하는 것 입니다.

root@localhost:~# #rm -rf /

rm잘못된 파일 / 디렉토리에서 실수로 실행되는 것을 방지 합니다. 확인되면 #처음부터 제거하십시오 . 이 트릭은 Bash에서 시작하는 단어로 #인해 해당 단어와 해당 줄의 나머지 문자가 모두 무시 되기 때문에 작동합니다 . 따라서 명령은 무시됩니다.

또는

중요한 디렉토리를 막으려면 한 가지 더 요령이 있습니다.

-i해당 디렉토리에 이름이 지정된 파일을 작성하십시오 . 그런 이상한 파일을 어떻게 만들 수 있습니까? 사용 touch -- -i또는touch ./-i

이제 시도해보십시오 rm -rf *:

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

여기서 명령 줄로 *확장 -i되므로 명령이 궁극적으로됩니다 rm -rf -i. 따라서 제거 전에 명령이 프롬프트됩니다. 당신은 당신이 파일을 넣을 수 있습니다 /, /home/, /etc/, 등

또는

--preserve-root옵션으로 사용하십시오 rm. 에서 rm새에 포함 된 coreutils패키지이 옵션은 기본값입니다.

--preserve-root
              do not remove `/' (default)

또는

사용 안전 RM은

웹 사이트에서 발췌 :

Safe-rm은 / bin / rm을 래퍼로 바꾸어 실수로 중요한 파일이 삭제되는 것을 방지하기위한 안전 도구로, 제거 할 수없는 파일 및 디렉토리의 구성 가능한 블랙리스트에 대해 지정된 인수를 검사합니다.

이러한 보호 된 파일 또는 디렉토리 중 하나를 삭제하려는 사용자는이를 수행 할 수 없으며 대신 경고 메시지가 표시됩니다.

$ rm -rf /usr
Skipping /usr

10
safe-rm은 지금 살펴보면 매우 좋아 보입니다 ...
Valentin Nemcev

45
safe-rm은 깔끔합니다. 또한 -i파일에 대한 멋진 트릭입니다 . 하 바보 bash.
EricR

5
유닉스에서 어떤 속임수가 이루어 졌는지 놀랍습니다.
WernerCD

4
-i라는 파일을 생성하는 것은 절대적으로 순수한 천재입니다. VPS에서 실수로 rm -rf / etc / *를 실행했을 때 약 1 년 전에 이것을 사용할 수있었습니다.
David W

9
천재입니다. touch -- -rf
마술

46

너의 문제:

실수로 rm -rf / *를 실행했지만 rm -rf ./*를 의미했습니다 (슬래시 다음에 별표 표시).

해결책 : 그렇게하지 마십시오! 실제로 ./는 경로의 시작 부분에 사용하지 마십시오 . 슬래시는 명령에 값을 추가하지 않으며 혼란을 야기 할뿐입니다.

./*는와 같은 의미 *이므로 위의 명령은 다음과 같이 작성하는 것이 좋습니다.

rm -rf *

관련 문제가 있습니다. 나는 누군가가 그 가정들은 다음의 식을 참조 FOO같은 값으로 설정됩니다 /home/puppies. 필자는 오늘날 주요 소프트웨어 공급 업체의 설명서에서 실제로 이것을 보았습니다.

rm -rf $FOO/

그러나 FOO설정되어 있지 않으면이 평가되어 rm -rf /시스템의 모든 파일을 제거하려고 시도합니다. 후행 슬래시는 필요하지 않으므로 실제로는 사용하지 마십시오.

다음은 동일한 작업을 수행하며 시스템을 손상시킬 가능성이 적습니다.

rm -rf $FOO

이 팁을 어려운 방법으로 배웠습니다. 14 년 전에 처음으로 슈퍼 유저 계정을 만들었을 때 실수로 rm -rf $FOO/쉘 스크립트에서 실행 되어 시스템을 파괴했습니다. 다른 4 명의 sysadmins는 이것을보고 이렇게 말했습니다. 모든 사람이 한 번만합니다. 이제 설치 미디어 (36 플로피 디스크)가 있습니다. 고쳐라. '

다른 사람들은 여기와 같은 솔루션을 권장 --preserve-root하고 safe-rm. 그러나 이러한 솔루션이 모든 Un * xe- 변형체에 존재하는 것은 아니며 Solaris, FreeBSD & MacOSX에서는 작동하지 않을 수 있습니다. 또한, safe-rm당신은 당신이 사용하는 모든 단일 리눅스 시스템에 패키지를 추가로 설치해야합니다. 에 의존 safe-rm하는 경우 새 작업을 시작했는데 safe-rm설치 되지 않은 경우 어떻게됩니까? 이 도구는 목발이며 알려진 기본값을 사용하고 작업 습관을 향상시키는 것이 훨씬 좋습니다.


19
친구는 절대 사용하지 않는다고 말했습니다 rm -rf *. 그는 항상 디렉토리를 먼저 변경하고 특정 대상을 사용합니다. 그 이유는 그가 쉘의 역사를 많이 사용하기 때문이며, 그의 역사에서 그러한 명령을하는 것이 잘못된 시간에 나타날 수 있다고 걱정합니다.
haggai_e

@ haggai_e : 좋은 팁. 내가 유닉스에 새 때, 나는 한 번 버그에 달렸다 달렸다 rm -rf *도 제거 .하고 ... 나는 루트 였고 이것은와 같은 하위 디렉토리로 이동했으며 ../../..상당히 파괴적이었습니다. 나는 rm -rf *그 이후 로 매우 조심하려고 노력합니다 .
Stefan Lasiewski

2
rm -rf $FOO필요한 경우 도움이되지 않습니다 rm -rf $FOO/$BAR. cd $FOO && rm -rf $BAR더 길지만 도움이 될 것입니다.
Victor Sergienko

5
@VictorSergienko, 배쉬와 어떻게 지정에 대한 ${FOO:?}같이 rm -rf ${FOO:?}/하고 rm -rf ${FOO:?}/${BAR:?}. 그것은로 번역되는 것을 막을 것입니다 rm -rf /. 내 대답에 이것에 대한 더 많은 정보가 있습니다 .
Acumenus 2019

@ haggai_e : 나는이 주제에 대한 가장 좋은 조언 중 하나를 찾습니다. rm -rf *실수로 잘못된 디렉토리로 변경되어 다른 것을 삭제하는 for 루프를 사용하여 손가락을 태 웠습니다 . 특정 대상을 사용했다면 잘못된 것을 삭제할 가능성이 훨씬 적었을 것입니다.
richk

30

이것이 "Serverfault"에 있기 때문에 다음과 같이 말하고 싶습니다.

많은 수의 서버 / 관리자 / 사용자로 구성된 서버가있는 경우 누군가 가 잘못된 디렉토리로 이동 rm -rf했거나 chown잘못된 디렉토리입니다.

최소한의 MTTR로 영향을받는 서비스를 백업 할 계획이 있어야합니다.


4
그리고 복구를 실습하기 위해 VM 또는 스페어 박스를 사용해야합니다. 작동하지 않는 것을 찾아서 계획을 세분화하십시오. 건물에 정전이 발생하고 고통 스러울 때마다 격주로 재부팅됩니다. 모든 랙을 계획적으로 종료함으로써 몇 일 동안 약 3 시간으로 줄였습니다. 매번 init.d 스크립트를 자동화 / 고정 할 비트를 배울 때마다
Danny Staple

그리고 VM에서이 명령을 시도하십시오. 흥미 롭군! 그러나 먼저 스냅 샷을 찍습니다.
Stefan Lasiewski

23

최선의 해결책은 rm직접 사용하지 않는 습관을 바꾸는 것 입니다.

한 가지 방법은 echo rm -rf /stuff/with/wildcards*먼저 실행하는 것 입니다. 와일드 카드의 출력이 적절한 지 확인한 다음 셸 기록을 사용하여을 사용하지 않고 이전 명령을 실행하십시오 echo.

또 다른 방법은 echo명령을 삭제하려는 내용이 눈에 띄는 경우 로 제한하는 것입니다. 디렉토리의 모든 파일을 제거하는 대신 디렉토리를 제거하고 새 디렉토리를 작성하십시오. 기존 디렉토리의 이름을로 변경 DELETE-foo한 다음 foo적절한 권한 으로 새 디렉토리를 작성 하고 마지막으로 제거하는 것이 DELETE-foo좋습니다. 이 방법의 부작용은 기록에 입력 한 명령이입니다 rm -rf DELETE-foo.

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

항상 존재해야하거나 디렉토리를 다시 만들 수있는 권한이 없기 때문에 디렉토리를 유지해야하기 때문에 많은 파일을 삭제해야하는 경우 파일을 다른 디렉토리로 이동하고 해당 디렉토리를 삭제하십시오. .

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

( Alt+ .키를 누르십시오.)

내부에서 디렉토리를 삭제하는 것은 매력적이기 때문에 rm -rf .오타의 위험이 적습니다. 불행히도 일반적인 시스템에서는 그렇게 할 수 없습니다. 당신은 위해 할 수있는 rm -rf -- "$PWD"오타의 위험이 높은 대신하지만 그들 중 대부분은 아무것도 제거하지로 이어집니다. 이것은 쉘 히스토리에 위험한 명령을 남깁니다.

가능하면 버전 관리를 사용하십시오. 당신은 rm, 당신 cvs rm또는 무엇이든 하지 않으며 , 그것은 취소 할 수 없습니다 .

Zsh에는 rm디렉토리의 모든 파일을 나열하는 인수를 사용하여 실행하기 전에 프롬프트를 표시하는 옵션이 있습니다 . rm_star_silent(기본적으로 켜짐)을 실행하기 전에 프롬프트 rm whatever/*하고 rm_star_wait(기본적으로 꺼짐) 확인할 수없는 10 초 지연을 추가합니다. 프롬프트가 표시 될 것으로 예상되므로 일부 디렉토리에서 모든 파일을 제거하려는 경우 이는 제한적으로 사용됩니다. 이 같은 오타 방지 할 수 있습니다 rm foo *를 들어 rm foo*.

rm명령 변경과 관련하여 더 많은 솔루션이 떠 있습니다 . 이 접근 방식의 한계는 언젠가는 실제 머신을 사용하고 확인을 기대할 때 안전하고 rm자동으로 전화 rm하고 다음으로 백업을 복원한다는 것입니다.


mv -t DELETE_ME -- *좀 더 바보입니다.
Tobu

@Giles rm직접 사용하지 않는 것이 좋습니다. 더 나은 대안은 명령사용하는 것find 입니다.
aculich

그리고 디렉토리를 유지 해야하는 경우 find somedir -type f -delete모든 파일을 삭제 somedir하지만 디렉토리와 모든 하위 디렉토리는 그대로 두어 사용하면됩니다.
aculich

19

언급했듯이 항상 별칭을 사용할 수 있습니다.

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

또한 명령 줄 트위터 클라이언트와 통합하여 rm -fr /*루트로 하드 디스크를 닦아서 자신에게 거의 굴욕을 느끼는 방법을 친구들에게 알릴 수 있습니다 .


3
telnet miku.acm.uiuc.edu의 경우 +1
Ali

1
alias echo = "telnet miku.acm.uiuc.edu"
kubanczyk

나는 구식이 아니어야합니다 ... 의의는 telnet miku.acm.uiuc.edu무엇입니까?
Kyle Strand

사용 해보고 알아보십시오. 비파괴 적입니다. 편집증 환자라면 VM에서 실행하십시오.
Naftuli Kay

3
-1 공백이있는 명령은 별명으로 사용할 수 없습니다. / * 유효하지 않은 이름입니다.
xenithorb


15

실수를 방지하는 가장 간단한 방법 rm -rf /*은 모든 rm명령 사용을 피하는 것입니다 ! 사실, 나는 rm /bin/rm명령을 완전히 없애기 위해 항상 달려 가고 싶어했습니다! 아니, 난 안면이 아니에요

대신 command -delete옵션을find 사용 하지만 먼저 파일을 삭제하기 전에 삭제할 파일을 미리 보는 것이 좋습니다.

find | less

최신 버전 find에서 디렉토리 이름을 생략하면 현재 디렉토리가 내재적으로 사용되므로 위의 내용은 다음과 같습니다.

find . | less

삭제하려는 파일이 확실하면 -delete옵션 을 추가 할 수 있습니다 .

find path/to/files -delete

따라서 find 사용하는 것이 안전 할 뿐만 아니라 더욱 표현력뛰어나 므로 특정 패턴과 일치하는 디렉토리 계층 구조의 특정 파일 만 삭제하려면 다음과 같은 표현식을 사용하여 미리 본 후 파일을 삭제할 수 있습니다.

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

find더 안전한 것 외에 배우고 사용해야하는 많은 이유가 rm있기 때문에 시간을내어 사용 방법을 익히면 나중에 스스로에게 감사 할 것 find입니다.


매우 흥미로운 토론. 나는 당신의 접근 방식을 좋아하고 약간의 발췌 문장을 만들었습니다. github.com/der-Daniel/fdel
Daniel Hitzel

14

이 스레드에는 정말 나쁜 조언이 있습니다. 운 좋게도 대부분의 투표가 거부되었습니다.

우선, 루트가되어야 할 때 루트가 되십시오-sudo가되고 다양한 별칭 트릭이 약해집니다. 그리고 더 나쁜, 그들은 당신을 부주의하게 만들 것입니다. 올바른 방법으로 일하는 법을 배우고 별명에 따라 멈추십시오. 언젠가는 훈련 용 바퀴가없는 상자에 뿌리를 내리고 무언가를 날려 버릴 것입니다.

둘째, 당신이 뿌리를 내릴 때, 자신을 학교 어린이들로 가득 찬 버스를 운전하는 것으로 생각하십시오. 때로는 라디오에서 노래를 부를 수 있지만 다른 경우에는 두 가지 방법을 모두 살펴보고 속도를 늦추고 모든 거울을 다시 확인해야합니다.

셋째 - 당신은 좀처럼 정말 필요가 없습니다 rm -rf- 당신이 원하는 가능성 mv something something.bak또는mkdir _trash && mv something _trash/

넷째-항상 ls당신의 와일드 카드 rm-영원히 파괴하기 전에 무언가를 보는 것에 대해 미친 것은 없습니다.


2
의 사용에 +1 ls.
Sachin Divekar

@eventi 나는이 스레드에 끔찍한 조언과 못생긴 해킹이 있음에 동의합니다. 그리고 그것을 파괴하기 전에 무언가를 보는 것이 확실히 좋은 생각이지만 , findcommand 를 사용하여 더 좋은 방법이 있습니다.
aculich

찾기가 더 간단하거나 안전한지 알지 못하지만 귀하의 find . -name '*~'모범이 좋습니다. 내 요점은 사용할 ls동일한 glob을 나열한다는 rm것입니다.
eventi

11

이것은 rm의 맥락에서 정규 표현식에 대한 나의 표준이지만,이 경우에는 당신을 구했을 것입니다.

echo foo*/[0-9]*{bar,baz}*정규 표현식이 일치하는지 확인하기 위해 항상 먼저 수행 합니다. 출력이 끝나면 명령 줄 편집으로 돌아가서로 변경 echo하십시오 rm -rf. 나는 결코 rm -rf테스트되지 않은 정규 표현식을 사용하지 않습니다 .



5
좋아, 나는 무엇을 찾고 있는가? 파일 일치에 대한 정규 표현식 구문이 perl에 사용 된 구문과 다른 점 (때로는 다른 이름으로 불림)을 지적하고 있습니까? 아니면 내가 놓친 다른 점이 있습니까? 생각이 느려서 죄송합니다. 토요일 아침 여기에 있습니다!
MadHatter

9
당신이 "regexp"라고 부르는 이런 것들이 실제로는 글로브입니다. 다른 정규식 구문은 아닙니다. 정규 표현식이 아닙니다.
bukzor

1
그 주장은 확실히 이루어질 수있었습니다. 그러나 정규 표현식에 대한 위키피디아 기사에서 "많은 최신 컴퓨팅 시스템이 파일 시스템에서 파일 이름과 일치하는 와일드 카드 문자를 제공합니다. 이는 많은 명령 줄 셸의 핵심 기능이며 글 로빙이라고도합니다." 하나 이상의 파일 이름 regexp와 일치하는 메타 문자를 포함하는 호출 토큰이 잘못되지 않았 음을 나타내는 "일컬어"라고도합니다. globbing은 파일 이름 일치에 정규 표현식을 사용하는 것 외에 다른 의미가 없기 때문에 더 나은 용어라는 데 동의합니다.
MadHatter

1
@MadHatter 또한, 글 로빙은 시각적으로 다소 비슷하지만 정규식과 의미 상 매우 다릅니다. 정규 표현식에서 의미 *Kleene Star 라는 매우 정확한 정의 를 갖습니다. Kleene Star 는 적용되는 집합의 0 개 이상의 요소와 일치하는 단항 연산자입니다 (정규 표현의 경우 문자 또는 문자 집합 앞의 문자 집합) Kleene Star), 반면에 *패턴을 잡는 데는 다음 패턴과 일치합니다. 구문이 비슷한 것처럼 보이지만 의미 상 매우 다릅니다.
aculich 2012

9

이 문제에 대한 해결책은 정기적 인 백업을 수행하는 것입니다. 잃어 버릴 위험이없는 것을 생산할 때마다 백업하십시오. 정기적으로 백업하는 것이 너무 고통 스럽다면 고통스럽지 않도록 프로세스를 단순화하십시오.

예를 들어, 소스 코드에서 작업하는 경우 코드 git를 미러링하고 다른 시스템에서 기록을 유지하는 것과 같은 도구를 사용하십시오 . 문서 작업을하는 경우 rsync문서를 다른 컴퓨터로 보내는 스크립트를 작성 하십시오.


btrfs와 같은 COW (Copy-On-Write) 파일 시스템도 도움이 될 수 있습니다. 외부 백업 외에 로컬로 실행되는 간단한 자동 스냅 샷 회전을 쉽게 설정할 수 있습니다.
malthe

6

이 위험을 줄이는 가장 좋은 방법은 대부분의 GUI와 같이 2 단계 삭제를하는 것 같습니다. 즉, rm을 같은 볼륨의 휴지통 디렉토리로 옮기는 것으로 바꾸십시오. 그런 다음 실수를 알아 차리려면 충분한 시간이 지난 후에 해당 쓰레기를 청소하십시오.

이러한 유틸리티 중 하나 인 trash-cli가 여기 에서 Unix StackExchange에 설명되어 있습니다 .


모든 머신에 가장 먼저 설치합니다. 기본 제거 도구 여야하며, rm은 지금 무언가를 완전히 제거해야 할 때만 사용됩니다. 아직 이륙하지 못한 것이 슬프지만 언젠가는 그럴 것입니다. 아마도 rm의 공개 인스턴스 이후에 백업으로 해결할 수없는 큰 문제가 발생했을 것입니다. 아마도 회복하는 데 걸리는 시간은 아마도 큰 요인이 될 것입니다.
Gerry

+1 20 년 동안 리눅스를 사용한 후에도 여전히 일종의 휴지통 동작이 있어야한다고 생각합니다 rm.
Shovas

3

이러한 유형의 실수를 피하기위한 중요한 핵심 요소는 루트 계정을 사용하여 로그인하지 않는 것입니다. 권한이없는 일반 사용자를 사용하여 로그인 할 때 sudo각 명령 에 사용해야 합니다. 따라서 더 조심해야합니다.


4
sudo가 이와 같은 것을 막을 것이라고 확신하지는 않습니다. "rm"앞에 "sudo"를 입력하더라도 OP와 동일한 오타를 만들 수 있습니다.
cjc

1
편집에서 루트로 작업하는 것을 언급 함
Valentin Nemcev

여전히 사용 sudo및 백업 에 대해 확신이없는 경우 이 페이지에서 찾아 보게 forum.synology.com/wiki/index.php/...을 . 휴지통을 만드는 방법에 대해 설명합니다. 도움이 되었기를 바랍니다!
Khaled

1
내가 sudo를하고 백업을 사용하고 @Khaled, 난 그냥이 특정 문제에 대한 더 좋은 것을 원하는
발렌틴 Nemcev

3

내가 재귀 적으로 디렉토리를 삭제하면, 나는을 넣어 -r, 그리고 -f해당되는 경우, 상기 최종 예를 들어, 명령,의 rm /foo/bar -rf. 이렇게하면 전체 경로를 입력하지 않고 실수로 Enter 키를 너무 일찍 누르면 명령이 재귀 적이 지 않으므로 무해 할 수 있습니다. 뒤에 슬래시를 입력하려고 할 때 Enter 키를 누르면 /foo, rm /foo대신 씁니다 rm -rf /foo.

GNU coreutils를 사용하는 시스템에서는 잘 작동하지만 다른 유닉스의 유틸리티는 옵션을 그런 식으로 배치 할 수 없습니다. 다행히도 나는 그런 시스템을 자주 사용하지 않습니다.


2

복잡 할 수 있지만 SELinux 내에서 역할 을 설정 하여 사용자가 sudo su-(또는 일반 su)를 통해 루트가 된 경우에도 파일을 삭제하는 기능이 제한 될 수 있습니다 (제거하기 위해 루트로 직접 로그인해야 함) 파일). AppArmor를 사용하는 경우 비슷한 작업을 수행 할 수 있습니다 .

물론 다른 해결책은 백업이 있는지 확인하는 것입니다. :)


2

사용하지 마십시오 글 로빙 . Bash에서을 설정할 수 있습니다 noglob. 그러나 noglob설정되지 않은 시스템으로 이동할 때 다시 잊어 버린 것처럼 진행할 수 있습니다.

세트 noclobber방지 mvcp너무 파일을 파괴.

파일 브라우저를 사용하여 삭제하십시오. 일부 파일 브라우저는 휴지통을 제공합니다 (예 : Konqueror ).

globbing을 피하는 또 다른 방법은 다음과 같습니다. 명령 줄, I에서 echo filenamepattern >> xxx. 그런 다음 Vim 또는 vi로 파일을 편집하여 삭제할 파일을 확인하고 (filenmates에서 파일 이름 패턴 문자를 확인하십시오.) %s/^/rm -f/각 줄을 삭제 명령으로 바꿉니다 . 소스 xxx. 이런 식으로 파일을 삭제하기 전에 삭제 될 모든 파일을 볼 수 있습니다.

파일을 'attic'디렉토리 또는 tarball로 이동하십시오. 또는 버전 관리를 사용하십시오 (앞서 언급했듯이).


파일을 삭제하기 전에 미리보기하는 방법을 사용하는 경우 +1이지만 명령 을 사용하여 더 간단하고 안전한 방법이find 있습니다.
aculich

2

ZSH는을 수행하기 전에 (기본값) 묻습니다 rm -rf *.


1

외부에서는 chattr루트가 그러한 명령을 실행하지 못하게하는 많은 안전 장치가 없습니다. 특권을 실행할 때 적절한 그룹과 신중한 명령이 중요한 이유입니다.

다음에; 삭제하려는 파일의 범위를 지정하십시오-에서 'f'를 생략 rm -rf하거나 사용 find하여 전달하십시오.xargs rm


당신이 사용하는 것이 좋습니다 좋은 find,하지만 난 내 대답에 그것을 사용하는 안전한 방법을 추천합니다 . xargs rm모든 최신 버전 find에는 -delete옵션 이 있으므로 사용할 필요가 없습니다 . 또한 안전하게 사용 xargs rm하려면 사용해야 find -print0하며 xargs -0 rm그렇지 않으면 공백이있는 파일 이름과 같은 문제가 발생할 때 문제가 발생합니다.
aculich

내 요점은 xargs에 대한 뉘앙스가 아니라 파일을 삭제 한 다음 계속하지 않고 먼저 find를 사용하는 것입니다.
thinice

예, 나는 파일을 사용하여 범위를 지정 find하는 것이 좋은 제안 이라고 생각 하지만, 사용을 제안하면 뉘앙스 xargs가 중요합니다. 그렇지 않으면 공백이있는 파일을 만날 때 혼란과 좌절로 이어집니다 ( -delete옵션 을 사용하여 피하십시오 ).
aculich 2012

1

유사한 재난을 방지하기 위해 다른 명령에 대한 일부 안전 별칭은 다음과 같습니다 .

# safety features
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I'                    # 'rm -i' prompts for every file
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'

대문자 -I는 다음과 다릅니다 -i.

세 개 이상의 파일을 제거하기 전에 또는 재귀 적으로 제거 할 때 한 번 묻습니다. 대부분의 실수로부터 여전히 보호 기능을 제공하면서 -i보다 방해가 적습니다.


I 옵션은 삭제하려는 내용을 에코하지 않습니다.
Calmarius

1

나는 일반적으로 -v깃발을 사용하여 무엇을 삭제하고 ^C있는지 확인하고 약간의 의심이있는 경우 신속하게 기회를 갖습니다. 실제로 나쁜 것을 방지 하는 방법은 rm아니지만 문제가 발생했을 때 피해를 제한하는 데 유용 할 수 있습니다.


1

유닉스 기반 머신에서의 삭제 프로세스는 다음과 같습니다.

  • ls /path/to/intented/file_or_directory터미널 창에 입력 한 다음 return(또는 Tab원하는 경우)를 눌러 파일 목록을보십시오.

모든 것이 좋아 보인다면

  • 터미널 기록에서 다시 up arrow가져 오려면 키를 클릭 ls /path/to/intented/file_or_directory하십시오.

  • 교체 lsrm또는 rm -r또는 rm -rf필요에 따라. 나는 개인적으로 -f깃발 을 좋아하지 않습니다 .

이 유효성 검사 프로세스는 또한이 프로세스를 rm따르기 전에 명령 이 조기에 실행되는 것을 방지합니다 .


파일을 삭제하기 전에 먼저 파일을 미리 보는 것이 좋은 생각이며 find 내 대답에서 설명 하는 것처럼 파일을 사용하는 것이 더 안전하고 표현적인 방법 입니다.
aculich

1

지금 새로운 습관을 들이지 않고 기분 .bashrc/.profile이 좋지 않다면 어리석은 짓을할지 확인하기 위해 몇 가지 테스트를 추가하는 것이 좋습니다. 나는 Bash 함수에서 내 하루를 망칠 수있는 패턴을 grep하고 이것을 생각해 낼 수 있다고 생각했다.

alias rm='set -f; myrm' #set -f turns off wildcard expansion need to do it outside of           
                        #the function so that we get the "raw" string.
myrm() {
    ARGV="$*"
    set +f #opposite of set -f
    if echo "$ARGV" | grep -e '-rf /*' \
                           -e 'another scary pattern'
    then
        echo "Do Not Operate Heavy Machinery while under the influence of this medication"
        return 1
    else
        /bin/rm $@
    fi
}

그것에 대한 좋은 점은 Bash 뿐이라는 것입니다.

그것은 그 형태로 충분히 일반적이지 않지만 잠재적 인 가능성이 있다고 생각하므로 아이디어 나 의견을 게시하십시오.


파일을 삭제하기 전에 미리 보는 것이 좋지만이 솔루션은 지나치게 복잡합니다. 대신 명령을 사용하여find 보다 일반적인 방법으로이를 간단하게 수행 할 수 있습니다 . 또한, "당신이 그것에 대해 좋은 점은 Bash뿐"이라고 말하는 이유를 이해하지 못합니까? 스크립트에서 bash-ism피하는 것이 좋습니다 .
aculich

"rm -rf ./*"및 "rm -rf dir / *"을 의미 할 때 "rm -rf / *"또는 "rm -rf dir / *"가 발생하지 않도록하려면 패턴 "/ *"를 감지해야합니다. 및 "*"(단순). 그러나 bash는 와일드 카드 인수를 전달하기 전에 와일드 카드 인수를 확장하기 때문에 grep을 통해 모든 명령 줄 인수를 전달할 수는 없습니다 (star는 폴더의 모든 내용으로 확장됩니다). "raw"인수 문자열이 필요합니다. "myrm"함수를 호출하기 전에 set -f를 사용하여 원시 인수 문자열을 전달하면 grep이 사전 정의 된 패턴을 찾습니다. *
kln

나는 당신이하려고하는 것을 Bash set -f와 동일하게 이해 set -o noglob하지만 여전히 그것에 대해 좋은 점은 Bash 뿐이라는 진술을 설명하지는 않습니다. 대신 전혀 사용하지 rm않고 명령을 사용find 하여 쉘에 대해 일반적인 방식으로 문제를 완전히 제거 할 수 있습니다 . 실제로 여기에서 제안한 것과 비교하여 그 제안을 시도 했습니까?
aculich

bash만으로 @ aculich 파이썬이나 펄 의존성이 없다는 것을 의미합니다. 모든 것은 bash에서 수행 할 수 있습니다. .bashrc를 수정하면 오래된 습관을 잃지 않고 계속 일할 수 있습니다. rm bash를 호출 할 때마다 바보 같은 일을하지 않도록합니다. 경고하고 싶은 패턴을 정의하기 만하면됩니다. "*"와 같이 현재 폴더의 모든 것을 제거합니다. 지금까지는 정확히 내가 원하는 것이지만 조금 더 많은 작업으로 "myrm"에 대화식을 추가 할 수 있습니다.
kln

@aculich OK gotcha. 아니요 시도하지 않았습니다. 워크 플로를 크게 변경해야한다고 생각합니다. Mac OS X에서 여기서 확인했습니다. .bash_history는 500이고 그 중 27 개는 rm입니다. 그리고 요즘에는 터미널을 자주 사용하지 않습니다.
kln

1

슬프게도, 업장이 충분하지 않아서 위의 의견을 남길 수는 없지만 safe-rm은 우발적 인 대량 삭제 악몽의 만병 통치약이 아니라고 다른 사람들에게 경고하고 싶었습니다.

다음은 Linux Mint 17.1 가상 머신에서 테스트되었습니다 (이러한 명령에 익숙하지 않은 사용자에게 경고 :이 명령을 수행하지 마십시오! 실제로는이 명령에 익숙한 사용자도 치명적인 데이터 손실을 피하기 위해이 작업을 수행하지 않아야합니다).

텍스트 버전 (축약) :

$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory

이미지 버전 (전체) :

여기에 이미지 설명을 입력하십시오


1

나는 휴지통의 창문 접근 방식을 좋아합니다.

나는 보통 "/ tmp / recyclebin"이라는 디렉토리를 삭제해야한다.

mkdir /tmp/recyclebin

그리고 rm -rf를 사용하지 마십시오. 항상 다음을 사용합니다.

mv target_folder /tmp/recyclebin

그런 다음 나중에 스크립트를 사용하거나 수동으로 휴지통을 비 웁니다.


0

Hehe (심지어 모욕적으로!) :

$ cat /usr/local/bin/saferm

#! /bin/bash

/bin/ls -- "$@"

echo "Those be the files you're about to delete."
echo "Do you want to proceed (y/N)?"

read userresponse

if [ "$userresponse" -eq "y" ]; then

  echo "Executing...."
  /bin/rm -- "$@"

fi

그리고:

alias rm="/usr/local/bin/saferm"

실제로는 루트로 실행 중인지, "스도"를 앞에 두는 등의 글로브를 사용하여 이러한 종류의 작업을 실행하기 전에 정신적으로 일시 중지해야합니다. 같은 글로브에서 "ls"를 실행할 수 있습니다. 그러나 정신적으로, 당신은 잠시 멈추고, 원하는 것을 타이핑했는지, 원하는 것이 실제로 원하는 것인지 확인하십시오. 나는 이것이 첫해에 무언가를 파괴함으로써 주로 배운 것으로 생각합니다. 핫 버너가 스토브 위의 물건이 뜨거울 수 있다고 알려주는 훌륭한 교사와 같은 방식으로 Unix SA.

그리고 당신은 좋은 백업이 있는지 확인하십시오!


위험한 일을하기 전에 두 번 생각하려고하지만 어쨌든 항상 효과가있는 것은 아닙니다. 과거에는 이와 같은 부주의 때문에 일을 파괴했습니다.
Valentin Nemcev

0

또한 보호 수단이 아니라 ^ C를 누르기 전에 삭제 된 파일을 찾는 방법으로 locate데이터베이스 를 사용할 수 있습니다 (물론 설치되어 있고 살아남은 경우에만 rm)

블로그 게시물 에서 그것에 대해 배웠 습니다


0

ZFS를 사용하여 실수로 제거하는 데 필요한 파일을 저장하고 다음과 같은 데몬을 갖습니다.

  • 이 파일 시스템의 스냅 샷을 정기적으로 만듭니다.
  • 이전 / 불필요한 스냅 샷을 제거합니다.

파일을 제거하거나 덮어 쓰거나 손상시킨 경우 파일 시스템을 마지막 양호한 스냅 샷의 복제본으로 롤백하면 완료됩니다.


0

너무 많은 대답이 아니라 팁, 나는 항상 그렇지 rm (dir) -rf않습니다 rm -rf (dir). 가능한 마지막 순간까지 핵을 가지 마십시오.

그것은 당신이 dir 이름을 팻핑하는 상황을 완화하는데 도움이됩니다.


스마트하지만 rm옵션이 파일 이름 앞에 와야 하는 BSD 에서는 작동하지 않습니다 .
svenper

네. 나는 최근에 사과를 사용한다는 것을 알았습니다. 수정 사항은 gnu 도구를 설치하고 모든 항목에 대한 별칭을 설정하고 / / 바람직하게 사과를 휴지통에 버리는 것입니다. :)
Sirex


1
내가 허락된다면, 나노초에. 리눅스와 비교하면 쓰레기입니다.
Sirex

0

나는 이것이 쉘에 * 확장 단축키가있는 강력한 예방 팁이라고 생각합니다.

먼저 rm -rf *또는 rm -rf your/path/*, DO N'T 유형 Enter키를 입력하십시오 . (물론,를 사용할 때 Enter 키를 빠르게 / 누르지 않도록주의하는 습관이 있어야합니다 rm -rf)

그런 다음 Alt-Shift-8(예 :)를 눌러 Alt-Shift-*bash에서 "*"와일드 카드를 명시 적으로 확장하십시오. 또한 히스토리를 탐색 할 때 "rm -rf *"명령을 다시 입력하지 않아도됩니다.

마지막으로, 확장에 올바른 파일 / 디렉토리가 있는지 확인한 후 Enter를 누르십시오.

끝난.


0

이것이 자신의 경우를 위해 누군가를 도울 수있는 경우 :

1. 사용 rmsafe:

파일을 "휴지통"폴더로 옮기고 항상 간단한 방법으로 파일을 다시 가져올 수 있습니다 mv.

$ rmsafe /path/to/important/files

출처 : https://github.com/pendashteh/rmsafe

2. 사용 safe:

rmsafe 를 사용 하기위한 별명을 설정할 수 있습니다 .

$ alias rm="safe rm"

이제 실행 rm /*하면 다음과 같이 응답합니다.

$ rm /*
Are you sure you want to 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]

그리고 나는 당신이 입력하지 않을 것이라고 믿습니다 y!

출처 : https://github.com/pendashteh/safe

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.