Kann ich `rm` nur mit Globbing interaktiv machen? (entweder in bash oder zsh oder in beiden)

15

Immer wenn ich rmmehrere Elemente gleichzeitig mit Muschelkugeln versuche und es sogar die geringste Möglichkeit gibt, dass sich das Muster stärker ausdehnt, als ich es erwartet habe, versuche ich mich daran zu erinnern, -ietwas Nützliches hinzuzufügen , aber (natürlich) könnte ich es vergessen und versehentlich wegblasen. Einige Leute versuchen, dieses Problem mit einem Alias ​​zu lösen, alias rm='rm -i'aber ich hasse die Idee, rm immer interaktiv zu machen, weil ich dann die Gewohnheit habe, die -fganze Zeit zu verwenden, was offensichtlich den ganzen Zweck zunichte macht.

Was ich tun möchte, ist, rmnur zu verwenden, -iwenn ich Globbing verwende, und -fnatürlich zu überschreiben -i, damit ich trotzdem ganze Verzeichnisse mit dem Üblichen wegblasen kann rm -rf junk.

Wäre also rm *blah*wirklich so rm -i *blah*, rm blahwürde aber genauso funktionieren wie eingegeben.

Für den Fall, dass es einen Unterschied gibt, wie dies in verschiedenen Shells erreicht werden kann, wähle ich eine Antwort aus, die Methoden für Bash und Zsh über Antworten liefert , die nur die eine oder die andere abdecken.


Hinweis : Ich bin nicht davon überzeugt, dass dies unbedingt eine gute Idee ist. Ich frage nur, ob es möglich ist. Wenn Sie der Meinung sind, dass dies eine dumme Idee ist, würde ich mich sehr über die Begründung Ihrer Meinung freuen, aber bitte posten Sie solche Kommentare nicht im Antwortfeld . Reale Antworten sagen mir entweder, wie ich das mache oder warum es nicht möglich ist (oder bieten möglicherweise eine alternative Methode an, um ein ähnliches Ergebnis zu erzielen). Aber wenn du mir sagen willst, warum das dumm ist, schreibe bitte einen Kommentar. Ich stimme wohlüberlegten Kommentaren zu, auch wenn ich mit der Schlussfolgerung nicht einverstanden bin.

Bilderstürmer
quelle
7
Ein paar Vorschläge: Mit GNU-Dienstprogrammen rm -Iwird -idas erst ausgelöst, wenn mehr als drei Dateien übergeben oder werden -r. In bash, verwendet Ctrl-x *Abkürzung Tastatur , um die glob zu erweitern und diese selbst inspizieren.
JW013
2
Mit bash glaube ich, dass die Antwort "nein" ist. Mit zsh können Sie dies möglicherweise ausnutzen, noglobindem Sie z. B. rm aliasen noglob my-rmund dann mit my-rm ein Skript erstellen, das nach einem Glob sucht, diesen erweitert und -i übergibt oder nicht. Nicht sicher, weiß nicht, zsh.
Derobert
@derobert: Sie sicherlich klingen wie Sie ziemlich gut kennen zsh.
Iconoclast
@iconoclast Nein, nicht zsh, nur Google. Seltsamerweise fand ich das, als ich versuchte, herauszufinden, wie man es in bash macht. :-P
derobert
Wenn Sie etwas wollen, das wie rm aussieht, aber tatsächlich anders funktioniert, sollte ich ein Skript (oder Alias ​​/ Funktion / Funktionstaste) mit dem Namen schreiben myrmund dieses Skript tun lassen, was für wundervolle Dinge Sie mögen.
Walter A

Antworten:

9

Es ist nicht einfach. Das Problem ist, dass wenn Sie tun:

rm -- *.txt

rm sieht nur die Liste der Dateien, nicht das Globbing-Muster, das bereits von der Shell erweitert wurde.

Was Sie tun könnten, ist (zsh):

alias rm='noglob rm'

Dies teilt zsh mit, dass Muster beim Aufrufen von rm nicht erweitert werden sollten. Dann können Sie rm als eine Funktion neu definieren, die die Erweiterung selbst ausführt und das "-i" hinzufügt, falls dies erforderlich sein sollte:

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

Das Problem bei diesem Ansatz ist jedoch, dass dieses neue "rm" den Unterschied zwischen nicht sieht

rm *

und

rm '*'

Um die aufgerufene Datei zu entfernen *, müssten Sie sie schreiben:

rm [*]
Stéphane Chazelas
quelle
-1

Funktioniert in Bash, wahrscheinlich in anderen Shells. Platzieren Sie in Ihrem.bashrc

function rm() { 
  while test "${1:0:1}" = "-"; do 
    shift
  done
  if test $# -eq 1; then 
    command rm "$1"
  else 
    command rm -i "$@"
  fi
}
doneal24
quelle
3
Sie können verwenden command rm, um Hardcodierung zu vermeiden PATH. Außerdem ist der Ansatz, die Anzahl der Argumente zu überprüfen, etwas unzuverlässig, da rmer Optionen beinhalten kann.
JW013
1
"$ 1" sollte in Anführungszeichen gesetzt werden. Andernfalls schlägt dies fehl, wenn die übergebene einzelne Datei ein Leerzeichen enthält. @ jw013 - Sie können dem Befehl auch entkommen, z. B.\rm
jordanm
@jordanm Sie haben Recht $1mit doppelten Anführungszeichen, aber Sie haben Unrecht mit dem fehlenden Befehl. Das Zitieren unterdrückt nur Aliase, NICHT das Nachschlagen von Funktionen. Diese Antwort schlägt eine Funktion vor, keinen Alias.
JW013
1
Zumindest die alte Bearbeitung war funktionsfähig - die neue Bearbeitung verwirft Benutzer-Befehlszeilenoptionen, was wahrscheinlich nicht die richtige Vorgehensweise ist.
JW013
@ jw013 - Mir war nicht bewusst, dass nur Alias-Lookups funktionieren, keine Funktionen. Danke für die Auskunft.
Jordan