globbing을 사용할 때만`rm`을 대화식으로 만들 수 있습니까? (bash 또는 zsh 또는 둘 다)


15

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 모두에 대한 답변을 제공하는 답변을 선택합니다 .


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


7
몇 가지 제안 : GNU 유틸리티와 rm -I비슷 -i개 이상의 파일이나이 때에만 트리거 -r전달됩니다. 에서 바로 가기 키를 bash사용 Ctrl-x *하여 글로브를 확장하고 직접 검사하십시오.
jw013

2
bash를 사용하면 대답이 "아니오"라고 생각합니다. zsh를 사용하면 noglobrm에 대한 별칭을 별칭으로 noglob my-rm지정한 다음 my-rm을 glob를 확인하고 확장하여 -i를 전달하는 스크립트로 사용할 수 있습니다. 확실하지 않습니다. zsh를 모르십시오.
derobert

@derobert : zsh를 잘 알고있는 것처럼 들립니다 .
iconoclast

zicon이 아닌 @iconoclast Nope, Google 만 있습니다. 이상하게도 나는 bash에서 어떻게하는지 찾으려고 노력했다. - P
derobert

rm처럼 보이지만 실제로 다르게 작동하는 것을 원한다면 스크립트 (또는 별명 / 기능 / 기능 키) myrm를 작성하고 해당 스크립트가 원하는 것을 수행하도록해야합니다.
Walter A

답변:


9

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

rm -- *.txt

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

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

alias rm='noglob rm'

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

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

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

rm *

rm '*'

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

rm [*]

-1

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
}

3
command rm하드 코딩을 피하기 위해 사용할 수 있습니다 PATH. 또한 인수 수를 확인하는 방법은 rm옵션 을 사용할 수 있으므로 약간 신뢰할 수 없습니다 .
jw013

1
"$ 1"은 따옴표로 묶어야합니다. 그렇지 않으면 전달 된 단일 파일에 공백이 있으면 실패합니다. @ jw013-또한 명령을 피할 수 있습니다.\rm
jordanm

@jordanm $1큰 따옴표 로 인용해야 할 필요성은 정확 하지만 명령 이스케이프에는 잘못되었습니다. 인용은 기능 조회가 아닌 별명 만 억제합니다 . 이 답변은 별칭이 아닌 함수를 제안합니다.
jw013

1
적어도 이전 편집은 작동했습니다. 새 편집은 사용자 명령 행 옵션을 버립니다.
jw013

@ jw013-함수가 아닌 별칭 조회에서만 작동한다는 것을 알지 못했습니다. 정보 주셔서 감사합니다.
jordanm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.