Ilekroć mam rm
kilka przedmiotów naraz z globowaniem skorupy i istnieje nawet najmniejsza możliwość, że wzór rozszerzy się bardziej niż się tego spodziewam, zawsze staram się pamiętać o dodaniu -i
, ale (oczywiście) mogłem zapomnieć i przypadkowo zdmuchnąć coś pożytecznego. Niektórzy próbują rozwiązać ten problem za pomocą aliasu, na przykład alias rm='rm -i'
nie podoba mi się pomysł, aby rm zawsze był interaktywny, ponieważ wtedy nabiorę nawyku korzystania z niego przez -f
cały czas, co oczywiście pokona cały cel.
To, co chciałbym zrobić, to rm
używać tylko -i
wtedy, gdy używam globowania, i -f
oczywiście w celu zastąpienia -i
, więc nadal mogę wymazać całe katalogi ze zwykłymi rm -rf junk
.
Dlatego rm *blah*
naprawdę byłoby, rm -i *blah*
ale rm blah
działałoby dokładnie tak, jak na maszynie.
W przypadku różnicy, w jaki sposób można to osiągnąć w różnych powłokach, wybiorę odpowiedź, która dostarcza metody zarówno dla bash, jak i zsh, zamiast odpowiedzi, które obejmują tylko jedną lub drugą.
Uwaga : tak naprawdę nie jestem przekonany, że to koniecznie dobry pomysł; Pytam tylko, czy to możliwe. Jeśli uważasz, że to głupi pomysł, byłbym bardzo szczęśliwy, słysząc uzasadnienie twojej opinii, ale proszę nie zamieszczaj takich komentarzy w polu odpowiedzi . Prawdziwe odpowiedzi albo mówią mi, jak to zrobić, albo wyjaśniają, że / dlaczego nie jest to możliwe (lub ewentualnie oferują alternatywną metodę uzyskania podobnego wyniku). Ale jeśli chcesz mi powiedzieć, dlaczego to jest głupie, napisz jako komentarz. Głosuję za uzasadnionymi komentarzami, nawet jeśli nie zgadzam się z wnioskiem.
rm -I
jest tak,-i
że uruchamia się tylko wtedy, gdy-r
zostaną przekazane więcej niż trzy pliki . Wbash
użyjCtrl-x *
skrótu klawiaturowego, aby rozwinąć glob i sprawdzić go sam.noglob
np. Z aliasingu rm donoglob my-rm
, a następnie mając my-rm jako skrypt, który sprawdza glob, rozwija go i przekazuje -i lub nie. Nie jestem pewien, nie znam Zsh.myrm
i pozwolić temu skryptowi robić to, co lubisz.Odpowiedzi:
To nie jest łatwe. Problem polega na tym, że kiedy:
rm widzi tylko listę plików, a nie wzorzec globowania, który został już rozwinięty przez powłokę.
Co możesz zrobić to (zsh):
Mówi to zsh, że wzorce nie powinny być rozszerzane podczas wywoływania rm. Następnie możesz ponownie zdefiniować rm jako funkcję, która dokonuje samego rozszerzenia i dodaje „-i”, jeśli zajdzie taka potrzeba:
Problem z tym podejściem polega jednak na tym, że ten nowy „rm” nie widzi różnicy między
i
Aby usunąć plik o nazwie
*
, musisz go zapisać:źródło
Działa w trybie bash, prawdopodobnie w innych powłokach. Umieść w swoim
.bashrc
źródło
command rm
aby uniknąć zakodowania na stałePATH
. Podejście polegające na sprawdzaniu liczby argumentów jest nieco niewiarygodne, ponieważrm
może to wymagać opcji.\rm
$1
z podwójnymi cudzysłowami, ale źle o ucieczce polecenia. Cytując tylko pomija aliasy, NIE wyszukiwanie funkcji. Ta odpowiedź sugeruje funkcję, a nie alias.