Всякий раз, когда я делаю rm
несколько элементов одновременно с использованием оболочки, и существует даже малейшая вероятность того, что шаблон расширяется до большего, чем я ожидаю, я всегда стараюсь не забыть добавить -i
, но (конечно) я могу забыть и случайно выбросить что-нибудь полезное. Некоторые люди пытаются решить эту проблему с помощью псевдонима, например, alias rm='rm -i'
но я ненавижу идею сделать rm всегда интерактивным, потому что тогда я привыкну использовать -f
все время, что, очевидно, победит всю цель.
То, что я хотел бы сделать, это rm
использовать только -i
тогда, когда я использую globbing, и, -f
конечно, для переопределения -i
, так что я все еще могу сносить целые каталоги обычным способом rm -rf junk
.
Поэтому rm *blah*
действительно будет, rm -i *blah*
но rm blah
будет работать точно так, как напечатано.
В случае, если есть разница в том, как это может быть достигнуто в разных оболочках, я выберу ответ, который предоставляет методы для bash и zsh вместо ответов, которые охватывают только один или другой.
Примечание : я не уверен, что это хорошая идея; Я просто спрашиваю, возможно ли это. Если вы думаете, что это глупая идея, я был бы очень рад услышать обоснование вашего мнения, но, пожалуйста, не размещайте такие комментарии в поле для ответов . Реальные ответы либо говорят мне, как это сделать, либо объясняют, что / почему это невозможно (или, возможно, предлагают альтернативный метод для получения аналогичного результата). Но если вы хотите сказать мне, почему это глупо, пожалуйста, оставьте комментарий. Я буду одобрять аргументированные комментарии, даже если я не согласен с заключением.
rm -I
это похоже на-i
то, что срабатывает только когда-r
передается более трех файлов . Вbash
, используйтеCtrl-x *
сочетание клавиш, чтобы развернуть шар и проверить его самостоятельно.noglob
, например, присвоить псевдониму rmnoglob my-rm
, а затем иметь my-rm скрипт, который проверяет глобус, расширяет его и передает -i или нет. Не уверен, не знаю, зш.myrm
и позволить этому скрипту делать то, что вам нравится.Ответы:
Это не легко. Проблема в том, что когда вы делаете:
rm просто видит список файлов, а не шаблон смещения, который уже был расширен оболочкой.
Что вы могли бы сделать, это (zsh):
Это говорит zsh, что шаблоны не должны раскрываться при вызове rm. Затем вы можете переопределить rm как функцию, которая сама выполняет расширение и добавляет «-i», если необходимо, что-то вроде:
Проблема с этим подходом заключается в том, что этот новый «рм» не видит разницы между
и
Чтобы удалить вызванный файл
*
, вам нужно написать его:источник
Работает в bash, возможно в других оболочках. Место в вашем
.bashrc
источник
command rm
чтобы избежать жесткого кодированияPATH
. Кроме того, подход проверки количества аргументов немного ненадежен, так какrm
может принимать варианты.\rm
$1
двойные кавычки, но ошибаетесь в отношении экранирования команды. Цитирование только подавляет псевдонимы, а НЕ ищет функцию. Этот ответ предлагает функцию, а не псевдоним.