쉘 와일드카드를 사용하여 한 번에 여러 항목을 추가할 때마다 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
}