와일드카드를 사용할 때만 "rm"을 대화형으로 만들 수 있나요? (bash나 zsh 또는 둘 다에서)

와일드카드를 사용할 때만 "rm"을 대화형으로 만들 수 있나요? (bash나 zsh 또는 둘 다에서)

쉘 와일드카드를 사용하여 한 번에 여러 항목을 추가할 때마다 rm패턴이 예상한 것 이상으로 확장될 가능성이 적더라도 항상 추가하는 것을 기억하려고 노력 -i하지만 (물론) 잊어버리고 실수로 유용한 것을 날려버릴 수도 있습니다. . 예를 들어 어떤 사람들은 이 문제를 해결하기 위해 별칭을 사용하려고 시도 alias rm='rm -i'하지만 나는 rm을 사용하는 아이디어를 싫어합니다.언제나-f대화형입니다. 왜냐하면 그렇게 하면 항상 그것을 사용하는 습관이 생기고 이는 분명히 전체 목적을 무너뜨리게 되기 때문입니다.

내가 원하는 것은 globbing을 사용하는 경우 rm에만 -i사용하는 것입니다. 그러나 물론 이는 -f재정의될 수 있으므로 -i계속해서 일반적인 rm -rf junk.

그렇습니다 rm *blah*. rm -i *blah*그러나 rm blah입력한 대로 정확하게 작동합니다.

이것이 다른 쉘에서 수행되는 방식에 차이가 있는 경우 bash에 대한 방법을 제공하는 답변을 선택하겠습니다.그리고zsh는 그중 하나만 다루는 답변 이상입니다.


노트: 실제로 이것이 반드시 좋은 생각이라고 확신하지는 않습니다. 그냥 괜찮은지 묻는 것뿐입니다. 이것이 어리석은 생각이라고 생각하신다면, 귀하의 의견에 대한 근거를 듣고 싶습니다만,답변란에 그런 댓글은 달지 말아주세요. 실제 답변은 이 작업을 수행하는 방법을 알려주거나 이것이 불가능한 이유를 설명하거나 이유를 설명합니다(또는 유사한 결과를 달성할 수 있는 다른 방법을 제공할 수도 있음). 그런데 이게 왜 멍청한 것인지 알려주고 싶다면 댓글을 남겨주세요. 비록 결론에 동의하지 않더라도 타당한 의견은 인정하겠습니다.

답변1

쉽지 않습니다. 문제는 다음과 같은 경우입니다.

rm -- *.txt

rm은 파일 목록만 볼 수 있으며 쉘에 의해 확장된 와일드카드 패턴은 볼 수 없습니다.

당신이 할 수 있는 일은 (zsh)입니다:

alias rm='noglob rm'

이는 rm을 호출할 때 스키마를 확장해서는 안 된다는 것을 zsh에 알려줍니다. 그런 다음 rm을 자신을 확장하고 다음과 같이 "-i"(필요한 경우)를 추가하는 함수로 재정의할 수 있습니다.

'rm'() {
  [[ "$*" = *[*[?]* ]] && set -- -i "$@"
  command rm $~@
}

그러나 이 접근 방식의 문제점은 이 새로운 "rm"이 다음과 같은 차이점을 볼 수 없다는 것입니다.

rm *

그리고

rm '*'

이름이 지정된 파일을 삭제하려면 *다음과 같이 작성해야 합니다.

rm [*]

답변2

9년 전에는 이 질문을 했을 때 그렇지 않았을 수도 있지만 지금 원하는 것은 zsh의 현재 기본값입니다. 실행하려는 시점을 확인 rm하고 *실행하기 전에 메시지를 표시합니다.

$ rm *
zsh: sure you want to delete all 10 files in /foo/bar [yn]?

다음과 같은 관련 셸 옵션도 있습니다.

RM_STAR_SILENT(-H)

rm *또는 를 실행하기 전에 사용자에게 쿼리하지 마십시오 rm path/*.

RM_STAR_대기 중

rm * 실행 중이나 실행 전에 사용자에게 쿼리하는 경우 rm path/*먼저 10초 동안 기다렸다가 이때 입력된 내용을 무시합니다. 이렇게 하면 yes 사람들이 의도하지 않은 질문에 반사적으로 대답하는 문제를 피할 수 있습니다. 대기 및 쿼리는 *ZLE(탭 포함)에서 확장하여 항상 피할 수 있습니다.

답변3

Bash에서 작동하며 다른 쉘에서도 작동할 수 있습니다. 당신의.bashrc

function rm() { 
  while test "${1:0:1}" = "-"; do 
    shift
  done
  if test $# -eq 1; then 
    command rm "$1"
  else 
    command rm -i "$@"
  fi
}

관련 정보