사용자가 rm과 와일드 카드 사이에 실수로 공백을 입력하지 못하도록 방지


29

의향:

rm -rf string*

문제:

rm -rf string *

첫 번째 경우는 rm의 합법적이고 일반적인 사용이며 작은 오타가 두 번째 경우에 많은 문제를 일으킬 수 있습니다. 우발적 인 후행 또는 선행 와일드 카드로부터 스마트하게 보호 할 수있는 간단한 방법이 있습니까?


8
최근 잘 구성 쉘 (로 zsh또는 bash리턴 키를 누르기 전에) 차라리 (트리거 자동 완성에) 탭 키를 눌러 습관을 걸릴 것이다
실레 Starynkevitch

2
touch -- -i인수에 와일드 카드를 포함 시키면 매개 변수로 -i전달 될 파일이 작성 됩니다 . rm-i
Reinstate Monica-M. Schröder

@ MartinSchröder : 파일이 존재하는 디렉토리에있을 경우
추후 공지가있을 때까지 일시 중지되었습니다.

@ MartinSchröder 입력 한 경우에만 작동합니다 rm *. 입력하면로 rm name *확장됩니다 rm name -i other names. -i파일 이름 앞에 있지 않기 때문에 옵션으로 처리되지 않습니다.
Barmar

1
일반적으로 사용자는이 작업을 한 번만 수행합니다.
tedder42

답변:


37

DEBUG트랩이 의심스러운 명령을 취소 작성할 수 있습니다. 다음 또는 이와 유사한 코드를 추가 할 수 있습니다 ~/.bashrc.

shopt -s extdebug
checkcommand() {
  if [[ $BASH_COMMAND = 'rm -r'*' *' ]]; then
    echo "Suppressing rm -r command ending in a wildcard" >&2
    return 1
  fi
  # check for other commands here, if you like
  return 0
}
trap checkcommand DEBUG

취향에 맞게 논리를 조정하십시오.

(실제로이 접근법이 유용하지 않을 것으로 기대합니다. 명령을 하나씩 파괴하여 명령을 엉망으로 만드는 방법은 너무 많지만 질문에 대한 문자 적 ​​대답을 제공합니다).


47

시스템을 완전히 방탄 할 방법은 없습니다. "확실합니까?" 일에 대한 프롬프트는 비생산적이며 "물론 확실합니다." 슬픔 반응.

지난 몇 년 동안 책에서 ls -R blah*찾은 속임수는 먼저 rm -fr blah* 목록을 작성하는 것입니다.

ls명령을 먼저 수행 한 다음 을 삭제하고 ls -R로 바꿉니다 rm -fr.

마지막 질문은 "정보가 당신에게 가치가 있다면 백업은 어디에 있습니까?"입니다.


4
오히려 최대보다 당신이 사용할 수있는 화살표 ^ls -R^rm -rf^어쩌면 별칭으로 설정
exussum

FWIW, 이것이 ls -R내가 기본적으로 항상하는 일이지만,이 시점에서 너무 본능적이어서 답을 통해 형성했을 때 내 의식이 사라졌습니다. 따라서 +1입니다.
JakeGould

또한 엔터 키를 누르거나 마우스를 충돌시켜 줄 바꿈으로 붙여 넣을 때 해를 끼치 지 않는다는 이점이 있습니다. 예를 들어 cat > .log, 보다 안전을 위해 비효율적 인 순서로 항목을 입력하는 경우가 .log있습니다. 그래서 > valuablefilecmdline 에는 아무 것도 없습니다 .
Peter Cordes

나는 rm aliased to을 사용하기 rm -i때문에 종종 rm 명령을 작성한 다음 \ 줄의 시작 부분에 a를 넣습니다 . ( \rm단어의 일부가 인용되었으므로 rm에 대한 별칭 확장을 피하십시오). 내가 또는를 필요로하는 -r경우에 -f, 때때로 나는 ls대신 대신으로 시작 rm하거나, 또는 그 -rf부분을 그냥 내버려 두십시오 . (편집, 당신은 어떻게 백 슬래시 코드 포맷을 얻는가? bquote bslash bslash bquote가 실패합니다.
Peter Cordes

8

당신 rmrf은 대신에 사용하도록 스스로 훈련 할 수 있습니까 rm -rf?

그렇다면이 bash 함수는 명령을 확인하기 전에 실제로 어떤 일이 발생하는지 볼 수있는 기회를 제공합니다.

rmrf() { echo rm -rf "$@"; read -p "Proceed (y/N)? "; [ "${REPLY,,}" = y ] && rm -rf "$@"; }

이 기능을 영구적으로 ~/.bashrc사용하려면 사용하는 각 컴퓨터 의 파일 에이 줄을 추가하십시오 .

공통 rm별명 과 비교

별명을 정의하는 것이 일반적입니다.

alias rm='rm -i'

여기에는 두 가지 제한이 있습니다.

  1. 이 별명에 의존하게되면 기계 나 환경이없는 환경에서 충격을 받게됩니다. 반대로, rmrf해당 기능이없는 머신 에서 실행 하면 무해한 상태로 돌아갑니다 command not found.

  2. -f명령 행에 제공 한 -i옵션이 별명에 있는 옵션을 대체 하므로이 별명은 도움이되지 않습니다 .


4
나쁜 생각이 아닙니다. 그러나이 기능이이 사용자가 사용하는 모든 시스템에 설치되어 사용 가능한지에 따라 다릅니다. 그래서 그들이 어떤 작업을 위해 원격 서버에 로그인하고 잘못된 rm -rf명령을 실행한다고 가정 해 봅시다 . 어떻게됩니까? 이와 같은 의사 함수를 만들면 궁극적으로 간단한 솔루션이 복잡해집니다. 더주의해서 권한이 무엇인지 이해하십시오.
JakeGould

4
@JakeGould 그리고 정말로 필요한 경우가 아니면 rm -f를 사용하지 마십시오 .
CVn

1
인수를 검사 rmrf하는 쉘 함수 rm를 작성하는 대신에 또는를 사용하여 왜 귀찮게 합니까? 그렇다면 특수 논리를 제정 -r하거나 -rf그렇지 않으면 command rm "$@"실제 rm명령 을 호출하기 위해 직접 호출하십시오 .
Charles Duffy

3
다른 이름을 사용하므로 재정의가 없을 때 발로 쏠 수 없습니다. 그리고 @ MichaelKjörling에 동의합니다 . -f없는 경우 필요 하지 않습니다 -i. -f예를 들어, 그대로 두면 읽기 전용 파일을 제거하기 전에 추가 경고가 표시됩니다.
Peter Cordes

6

내가 잘못된 파일을 삭제하는 것은 정말 큰 문제가, 내가 좋아하는, IS는 휴지통 폴더를 만들했던 것들 중 하나는 상황에서 나는 경우 mkdir trashcan다음, 나는 스크립트가 rmTrashcanA가 들어 rm -rf trashcan/*rm -rf *또는 유사한, 매우 신중하게 작성하고 여러 번 확인했습니다.

그렇게하면 실수를 저지르면 실수는 mv명령이 아니라 rm명령에있는 것입니다. 일단 내가 ls하고 삭제하는 것을 정확하게 확신 하면 rmTrashcan실제로 더러운 작업을 안전하게 수행합니다.

백업을 삭제해야하는 상황에도 매우 편리했습니다. mv휴지통으로 한 달 동안의 백업을 할 수 있었으며 , mv그 중 몇 개 (월 1 일, 15 일)를 백업으로, rmTranshcan나머지 는 다시 보관하려고했습니다 . 비슷한 명령을 수행 rm하는 것은 자체적 으로 수행하기가 어렵고 , 이렇게 ls하면 백업에서 삭제하려는 파일을 열거하는 것이 아니라 남은 파일을 확신 할 수 있습니다.


4

두 개의 명령 ( lsrm)을 사용하는 대신 간단하고 쉬운 방법을 사용하는 것이 좋습니다 find.

find . -maxdepth 1 -name "string*" -delete

실수로 입력 "string *"하면 이름이 지정된 파일 string charsstring letters(원하는대로) 파일이 삭제 되지만 *쉘 과 같이 모든 파일을 가져 가지는 않습니다 .

또한 -delete파일을 삭제하여 삭제할 파일을 확인한 다음 -delete입력 ^ls -R^rm -rf하거나 다른 넌센스 보다 쉽게 화살표와 유형을 입력 할 수 있습니다.


A find는 명령 행에 선언 된 명시 적 매개 변수 대신 일치하는 파일을 중첩 검색합니다. 나는 이것이 마크를 그리워한다고 생각합니다. 그래도 잘못 될 수 있습니다.
킬러 미스트

3

우발적 인 후행 또는 선행 와일드 카드로부터 스마트하게 보호 할 수있는 간단한 방법이 있습니까?

실제로는 아닙니다. 다른 답변에서는 작업을 실행하기 전에 프롬프트를 추가하는 사용자 지정 명령을 만들 수 있습니다. 그러나이 사용자 정의 명령의 문제점은 작업중인 시스템에 의식적으로 설치해야한다는 것입니다. 그리고 그것이 설치되어 있어도 문제는 y작업을 수행하기 위해 맞닥 뜨리는 반사 작용 입니다.

이는 텍스트 / 명령 줄 수준에 있어도 모든 사용자 인터페이스 문제임을 의미합니다. 하지 말아야 할 일을 방지하기 위해 얼마나 많은 안전망이 있어야합니까? 그것은 가위와 같습니다 : 어떻게 든 과실이 있고 천이나 종이를 자르려고 할 때 손을 미끄러 뜨리고 자르면 누가 잘못입니까? 또는 신호등 및 정지 신호 : 운전자가 이러한 위험한 행동에 관여 할 경우 발생할 수있는 상황에 대한 급성 인식 이외의 신호등을 무시하거나 신호등을 무시하는 것은 실제로 없습니다.

즉, 가장 현실적인 솔루션은 사용자뿐만 아니라 그룹의 시스템 권한에 있습니다. 그것은 사용자를 자신으로부터 보호하기위한 최상의 / 유일한 실제 안전망입니다.

액세스하는 유일한 시스템 인 시스템에서 작업하는 경우 chmod 777모든 것에 유혹을받을 수 있지만 이는 합리적 시스템 설정 방식이 아닙니다. 대신 권한은 755모든 디렉토리 및644 모든 비 실행 파일에 대한 합니다. 실행 파일은 755최소한이어야하지만 744다른 사용자가 읽기만하고 파일을 실행하지 않도록하려는 경우 에도 마찬가지 입니다.


2

플래그 rm없이 초기 명령을 작성해보십시오. 대신 삭제하려는 각 파일을 묻는 메시지 가 표시 됩니다. 작은 재귀 삭제의 경우 명령이 올바르게 입력 된 후 키를 길게 누를 수 있습니다 . 대량 삭제의 경우 작업을 중단하고 명령 줄 기록을 사용하여를로 신중하게 변경할 수 있습니다 .-f-irmy-i-f


실제로 y[RETURN]모든 파일 을 눌러야 합니다. GNU rm으로 유지할 수있는 것은 없습니다. -i명령을 올바르게 입력하면 편집 방법을 사용할 수 있습니다. 그런 다음 읽기 전용 파일 및 기타 사항에 대해서만 프롬프트가 표시됩니다.
Peter Cordes

1
rm -I한 번만 프롬프트하고 잠재적으로 위험한 삭제 (즉, 많은 파일)에만 프롬프트되도록 사용 하십시오.
Nick Matteo

1
덜 건설적인 포럼에서 제 답변은 "타자 / 교정이 그렇게 나쁘면 와일드 카드와 함께 'rm -rf'를 사용하는 사업이 없습니다." 나는 -I 스위치에 대해 몰랐다. '마지막'man rm '을했을 때. :)
Nevin Williams

2

rm은 제거하기 전에 확인해야 할 플래그 -i-I플래그를 가지고 있습니다. 과거에는 일부 배포판에서 기본적으로 배포판이 켜져있었습니다. 이것은 끔찍한 생각입니다. 정상적인 작동을 위해 사용자에게 너무 많은 확인 대화 상자를 제공하면 습관적으로 확인하기 시작합니다. 이것은 단지 "조심해야"(항상 붉은 깃발) 요구를 새롭고 더 성가신 대화로 바꾼다. "예. 예. 예. 예! 예! 맙소사, 바보 같은 컴퓨터는 파일을 YESYESYESYESYES-- 삭제합니다. NO NONOOOOOOO! 이것이 "예, 그러나 의미가 없습니다"대화 문제입니다. 이 답변은 왜 확인 대화 상자가 틀렸는 지 시각적으로 설명 합니다.

당신이 묘사하는 실수 는 "의도되지 않은 행동의 수행" 이라는 전표 입니다. 사용자는 일반적으로 실수를 즉시 인식하고 해결 방법을 정확히 알고 있습니다. 불행하게도 Unix는 사용자에게 기회를주지 않고 rm은 파일을 즉시 삭제합니다. 다른 모든 운영 체제는 휴지통을 사용하여 최소한 잠시 동안 삭제를 취소 할 수있게하여이 문제를 해결합니다.

유닉스에는 다양한 휴지통 시스템 이 있으며이 답변에는 제안이 가득합니다 .

질문은 별칭 rm에 대한 것인지 아닌지에 대한 것입니다. 앨리어싱에 대한 장점

  1. rm 대안을 사용하는 것을 잊어 버릴 수는 없습니다.

별칭 별칭 사용

  1. 당신은 그것을 가지고 있지 않은 시스템에 의존하게 될 것입니다.
  2. 디스크가 거의 가득 차면 문제가 발생할 수 있습니다.
  3. 휴지통을 주기적으로 비우려면 인프라가 필요합니다.
  4. 프로그램에서 rm의 예상되는 동작을 방해하지 않아야합니다.
  5. rm을 완전히 에뮬레이션하지 못할 수 있습니다.

첫 번째 인수를 너무 많이 따르는 경우 vi (vim, vi 아님), csh (tcsh, csh 아님) 및 기타 구식 유틸리티를 사용할 수 있습니다. 여전히 환경을 과도하게 사용자 정의 할 위험이 있습니다. 나는 유틸리티를 가져 가서 가능한 한 쉽게 만드는 것을 선호합니다. YMMV.

둘과 셋은 기술적 인 문제입니다. 그들은 쓰레기의 크기를 확인하고 tmpreaper 와 유사하게 정기적으로 물건을 청소하는 영리한 사신 작업으로 해결할 수 있습니다 . 이것은 크론 작업이거나보다 영리한 버전은 많은 데스크탑 Linux 배포판에서 사용 가능한 다양한 파일 시스템 이벤트 인프라를 사용할 수 있습니다. 이것은 간단하지 않으며 효율적으로 수행하기가 더 어렵습니다. 자신 만의 시스템을 만드는 것보다 기존 시스템을 찾는 것이 좋습니다.

네 번째는 새 rm을 쉘 별명으로 만들어서 처리 할 수 ​​있으며 alias rm='trash'프로그램에는 영향을 미치지 않습니다.

다섯 번째는 독자가 해결해야 할 문제입니다. rm에는 스위치가 많지 않습니다.


에 대한 별칭이 rm rm -i이지만 에일리어싱 되지 않은 \rm동작을 얻기 위해 자주 사용 합니다. 나는 rm -i계획 중 하나에 args 중 하나에 대해 아니오라고 말할 때마다 타이핑 합니다. 때로는 명령으로 ls명령을 시작한 다음 완료되면 \ rm 만 넣습니다. 그래서 실수에 수익을 칠 수있는 방법은 없습니다 rm -rf /대신은/.../file
피터 코르

rm -I또는 rm --interactive=once훨씬 더 성 가시고 rm -i여전히 위험한 것을 잡습니다 (파일이 3 개 이상이거나 재귀적일 경우에만 프롬프트가 표시되고 FOR FILE 대신 FORCE).
Nick Matteo

@ 쿤도 네, 방정식을 변경하지 않습니다. 아마도 사용자가 그것을 무시할 가능성이 높습니다. 사용자에게는 목표가 있습니다 : 물건 삭제. "방금 삭제하라는 내용을 삭제 하시겠습니까?"라는 메시지가 표시됩니다. 사용자는 여전히 삭제 대상을 확인하고 삭제 대상을 확인하지 않기 때문에 생각없이 "예"라고 말합니다. -i사용자에게 목표를 변경할 시간을 줄 수 있습니다. 관련 질문에 대한이 답변은 모든 것을 제시합니다.
Schwern

@ Schwern : 그러나 아무도 rm -i그것을 끄지 않고 30 초 이상 살 수는 없습니다 . rm -I당신이 망 쳤을 가능성이있을 때만 프롬프트를 표시 하는 반면 ; 프롬프트는 큰 삭제에만 나타납니다. 몇 가지 항목을 삭제하려고 할 때 프롬프트가 표시되면 실수로 "foo *"를 입력했음을 알게됩니다.
Nick Matteo

@Kundor 세 개 이상의 파일을 삭제하고 재귀 적으로 삭제하는 것은 ( -rf방금 발견 한 습관에 의해 확인이 비활성화 됨 ) 가능성이 높은 문제를 감지하기위한 프록시가 좋지 않습니다. 서브 디렉토리를 삭제하려고하더라도 문제가되지는 않습니다. 이 메시지는 사용자가 확인하지 않을 시점에 유용한 정보를 추가하지 않고 사용자가 말한 내용을 확인하기 때문에 도움이되지 않습니다. "rm : 1 개의 인수를 재귀 적으로 제거 하시겠습니까?" "예, 디렉토리를 삭제했습니다. 방금 말 했군요! ... 기다려, 어떤 디렉토리였습니까? CRAP !!!"
Schwern

2

나는 !$마지막 명령 트릭에서 = 마지막 인수에 대해 모든 사람들에게 가르칩니다 .

% ls job[XYZ].*
jobX.out1
jobX.out2
[rest of the matches]

% rm !$

이렇게하면 와일드 카드 확장을 검사 한 다음 앞에 공백을 넣지 않고도 정확히 같은 글로브 패턴을 사용할 수 있습니다 *.

또한 사람들은 잠재적으로 파괴적인 명령 줄에 글 로빙 와일드 카드 패턴을 자르고 붙여 넣지 말 것을 제안합니다. 내 손에 문제가 있었기 때문에 :)

실험실의 한 기술이 지난 주 (3 개월간) 실수를했습니다. 네, 백업이있었습니다 (1 일 뒤).


0

"주의를 기울이지 않는 습관을 들이게되므로 별칭 / 확인 메시지를 표시하지 마십시오."

시원하고 모든 것. 내 말은, 당신이에 대한 별칭을 만들어야한다고 생각하지 않는다는 것 rm(또는을 rmrf쉽게 망칠 수 있고 실제 명령을 입력 할 수 있기 때문에).

그러나 왜 별칭 / 스크립트를 만들어 호출 할 수없고 remove하나의 인수 (예 : $ 1) 만 제공 할 수 없습니까? 부주의 한 공간으로 인해 와일드 카드는 2 달러가되어야합니다 (애매한?) 예, 한 번에 하나의 삭제 세트 (와일드 카드 사용) 만 수행 할 수 있지만 이는 지불하는 가격입니다.

좋은 것을 쓰고 있다면 삭제하려는 파일과 디렉토리의 수와 삭제하려는 총 크기를 알려주고 확인을 요청하지만 흐름을 방해 할 수 있습니다. 플래그 옵션을remove 있습니까? (-나는). 그것의 경우에도 볼 수있는 검사에게 $ 1을 (를) 수행 할 수있는 단지 당신이 실제로있어 디렉토리 목록이 하나의 와일드 카드 및 확인을 요청합니다.


제쳐두고, 많은 rm교체가 있습니다. 많은 사람들이 UI 데스크톱 휴지통을 준수하려고합니다. 그 중 일부는 살펴볼 가치가 있습니다.


6
"삭제"별칭은 한 번에 둘 이상의 파일을 제거하지 않습니다. 명령이보기 전에 쉘이 확장하기 때문에 와일드 카드를 사용할 수 없습니다.
hymie

따라서 평가를 한 다음 스크립트로 가져 옵니까?
user3082

입력 remove \*하시겠습니까? 스크립트가 쉘이 입력을 glob-expand하도록 허용하면 크게 도움이되지 않습니다.
Peter Cordes

0

매우 간단한 트릭은 -rf마지막 에 두는 것입니다 . rm whatever* -rf
이렇게하면 오류 비율이 급격히 줄어 듭니다 *.
모든 것이 해결되지는 않습니다. 간단한 일상 트릭입니다.

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