globbing을 사용할 때만`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 모두에 대한 답변을 제공하는 답변을 선택합니다 .


참고 : 실제로 이것이 반드시 좋은 아이디어라고 확신하지는 않습니다. 나는 그것이 가능한지 묻고 있습니다. 이것이 멍청한 생각이라고 생각되면, 나는 당신의 의견에 대한 추론을 듣고 기뻐할 것이지만 답변 필드에 그러한 의견을 게시하지 마십시오 . 실제 답변은이 작업을 수행하는 방법을 알려주거나 불가능한 이유 / 이유를 설명하거나 유사한 결과를 얻는 다른 방법을 제공합니다. 그러나 이것이 왜 바보인지 알려주려면 의견으로 게시하십시오. 결론에 동의하지 않더라도 합리적인 의견을 표명합니다.



답변

쉽지 않습니다. 문제는 당신이 할 때 :

rm -- *.txt

rm은 셸에 의해 이미 확장 된 globbing 패턴이 아니라 파일 목록 만 표시합니다.

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

alias rm='noglob rm'

이것은 rm을 호출 할 때 패턴을 확장해서는 안된다는 zsh에 알려줍니다. 그런 다음 rm을 확장 자체를 수행하고 필요한 경우 “-i”를 추가하는 함수로 rm을 재정의 할 수 있습니다.

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

그러나이 접근 방식의 문제점은이 새로운 “rm”이

rm *

rm '*'

라는 파일을 제거하려면 *다음과 같이 작성해야합니다.

rm [*]

답변

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
}