Чи можу я зробити `rm` інтерактивним лише під час використання глобінгу? (або в bash, або zsh або в обох)


15

Кожного разу, коли я rmодноразово обробляю декілька предметів, і навіть є найменша можливість, щоб візерунок розширився до більшого, ніж я очікував, я завжди намагаюся запам'ятати, щоб додати -i, але (звичайно) я можу забути і випадково підірвати щось корисне. Деякі люди намагаються вирішити цю проблему псевдонімом, наприклад, alias rm='rm -i'але я ненавиджу ідею зробити rm завжди інтерактивним, тому що тоді я ввійду в звичку використовувати -fвесь час, що, очевидно, переможе всю мету.

Що я хотів би зробити, це 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 *поєднання клавіш , щоб розширити Glob і перевірити це самостійно.
jw013

2
З баш, я вважаю, що відповідь "ні". З zsh ви можете скористатись noglob, наприклад, псевдонімом rm до noglob my-rm, а потім мати my-rm сценарій, який перевіряє глобальність, розширює його та передає -i чи ні. Не впевнений, не знаю zsh.
дероберт

@derobert: ви , звичайно , звучить , як ви знаєте , ЗШ досить добре.
іконоборство

@iconoclast Nope, не zsh, просто Google. Як не дивно, я виявив, що намагаючись знайти, як це зробити в баш. :-P
дероберт

Якщо ви хочете щось схоже на rm, але насправді працює інше, я повинен написати сценарій (або псевдонім / функцію / функціональний ключ), який називається, myrmі дозволити цьому сценарію робити те, що вам подобається.
Вальтер А

Відповіді:


9

Це не легко. Проблема полягає в тому, що коли ви робите:

rm -- *.txt

rm просто бачить список файлів, а не шаблон глобалізації, який вже розширений оболонкою.

Що ви можете зробити, це (zsh):

alias rm='noglob rm'

Це говорить zsh, що шаблони не слід розширювати під час виклику rm. Тоді ви можете перевизначити rm як функцію, яка виконує розширення і додає "-i", якщо потрібно, щось подібне:

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

Проблема такого підходу полягає в тому, що цей новий "rm" не бачить різниці між

rm *

і

rm '*'

Щоб видалити названий файл *, вам доведеться записати його:

rm [*]

-1

Працює в баші, ймовірно, в інших оболонках. Місце у своєму.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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.