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
}