Ich wollte ein Paket in meiner Home-Datei löschen, aber der Dateiname war zu lang ( google-chrome-stable_current_i386.deb
). Also habe ich beschlossen, den Befehl ls|grep chrome|rm
zu verwenden, um die Dateien per Pipe an grep weiterzuleiten, um die Chrome-Datei herauszufiltern und sie dann zu entfernen. Es hat nicht funktioniert, also würde ich gerne sehen, wie ich das machen kann.
33
rm -i *chrome*.deb
ls
find
-find . -name "*chrome*" -delete
.ls
durchgrep
zu ,rm
konnte aber nicht an die Arbeit. Auf diese Weise erhalten Sie eine oder zwei gute Antworten auf die "richtige" oder "einfachste" Art, Ihre Aufgabe zu erfüllen, anstatt jemanden zu zwingen, Ihnen eine gute Antwort auf eine ineffiziente Lösung zu geben.Antworten:
Das ließ mich fast zusammenzucken.
ls
wird mehr zu kompliziert und fehleranfällig als die etablierten Methoden wiefind [...] -exec
oder Klümpchen .rm google
und drücken Tab. Wenn der Vorgang nicht sofort abgeschlossen wird, drücken Sie Taberneut, um eine Liste der übereinstimmenden Dateien anzuzeigen. Geben Sie weitere Zeichen des Dateinamens ein, um ihn einzugrenzen, bis er vollständig ist, und führen Sie dann den Befehl aus.quelle
rm
Sie blind ausführen - dies ist wahrscheinlich die üblichere Methode, um Ihre Distribution zu braten.Sie können den Befehl find auch mit einem Platzhalter verwenden:
Beachten Sie, dass das Argument "-maxdepth" sicherstellt, dass find nur im aktuellen Verzeichnis funktioniert und nicht in Unterverzeichnisse zurückgeführt wird.
quelle
-iname
für Dateinamen ohne Berücksichtigung der Groß- / Kleinschreibung (b) Pipe für diexargs
Verwendung von-print0
Flag fürfind
und-0
Flag fürxargs
. Die Verwendung vonxargs
ermöglicht es Ihnen, Dinge wie "interaktive" (Löschbestätigungfoo
?) Zu löschen .find . -name '*chrome*' -exec rm -i {} +
maxdepth
, dass Sie 1 seinSie hatten die richtige Idee, haben nur ein paar Details übersehen. Da Sie mit einer Liste zu tun haben, die zu STDIN kommt und
rm
Parameter erwartet, müssen Sie verwendenxargs
.Somit:
Sollte dir geben, was du willst.
Beachten Sie, dass Sie der Anweisung
chrome
einfach hinzufügen können , wenn Sie alles andere als die Datei löschen möchten .-v
grep
Beachten Sie, dass dies nach den anderen Antworten auf diese Frage wahrscheinlich ein schlechter Weg ist, um das zu erreichen, was Sie erreichen möchten.
quelle
-v
, würde das nicht löscht alles außer für Dateien , die passenchrome
? Ich glaube nicht, dass die OP das will ...ls
Ausgabe keine "seltsamen" Dateinamen enthält . Dateinamen mit Leerzeichen zerstören dies. Dies ist auch gefährlich, wenn jemand in dem Verzeichnis, in dem Sie dies ausführen, einen Dateinamen mit einer speziellen Sauce erstellen kann. Wie mehr als eine Person bereits darauf hingewiesen hat, analysieren Sie nicht die Ausgabe von ls !Niemals die Ausgabe von ls analysieren
Mein Vorschlag ist, die Ausgabe von ls [ 1 ] nicht zu analysieren , noch mehr, wenn dies in Verbindung mit dem
del
Befehl geschieht . Dies hängt aus vielen Gründen hauptsächlich mit unerwarteten und nicht üblichen Zeichen zusammen, die im Dateinamen zulässig sind.Selbst wenn Sie erwarten sollten, dass sich die zu Linux-Paketen gehörenden Dateinamen "gut verhalten" , kann dieses Problem dennoch auftreten, wenn andere Dateien im selben Verzeichnis vorhanden sind, Sie dies jedoch nicht wussten oder bemerkten.
Es ist besser
find
, die Tabulatorerweiterung (schreiben Sie den Namen und drücken Sie Tab), die Dateinamenerweiterung [ 2 ] als*MyKey*
...Eine schnelle Lösung
Da Sie alle Pakete (die mit enden
.deb
) mit "google" auswählen möchten, können Sie Ihre Anfrage mit dem Platzhalter erstellen*
*google*.deb
und eine einfache Aktion ausführenDadurch wird jeder Dateiname mit "google" in der Mitte ausgewählt,
.deb
der im aktuellen Verzeichnis vorhanden ist. Die Option-i
(interaktiv) fordert zur Bestätigung auf, eine gute Gewohnheit, wenn Sie Dateien mit der Parametererweiterung löschen.Eine Lösung nahe der Philosophie Ihres Versuch
Wenn Ihr Zweck ist der Command Stück für Stück zu bauen, so dass Sie getan haben
ls
, nachls | grep google
, und erst , nachdem Sie die Ausgabe überprüft Sie es in einer Subshell ausführen kann ,$(...)
mitEine schnellere und gefährlichere Methode [ 3 ] ist die Verwendung
!!
Dadurch wird der letzte in Ihrem Verlauf beendete Befehl ausgeführt . Sie können sich davor schützen, dass Sie keine visuelle Kontrolle über die auszuführende Zeile haben, wenn Sie zuvor die Shell-Optionen
histverify
mit aktiviert habenshopt -s histverify
.quelle
... verwenden
-name '*c*.deb'
Sie stattdessen ein anderes Muster.quelle
rm
akzeptiert keine Eingaben vonstdin
. Sie müssen so etwas tunls google-chrome* | xargs rm
quelle