Entfernt 'rm files *' alle Übereinstimmungen aus allen Unterverzeichnissen?

13

Ich möchte alle Dateien, die so aussehen, wordpress-891.sqlaus dem aktuellen Verzeichnis entfernen (nicht in Unterverzeichnissen).

Wird rm wordpress-*.sqlder Trick ausgeführt oder werden auch Übereinstimmungen aus Unterverzeichnissen entfernt?

HorusCoding
quelle
1
Nebenbei bemerkt, obwohl alle anderen Antworten korrekt sind, gibt es noch eine weitere Wendung: Es ist tatsächlich Bash, nicht der Befehl rm, der den Platzhalter erweitert. Wenn Sie zehn übereinstimmende Dateien in Ihrem Verzeichnis haben, wird rm nicht den Platzhalter sehen, sondern zehn einzelne Argumente. Wenn Sie möchten, dass rm die Erweiterung ausführt, müssen Sie Ihr Argument in einfache Anführungszeichen setzen. Für rm macht es keinen Unterschied, aber in einigen anderen Zusammenhängen kann es sein. Normalerweise, wenn sich der Platzhalter auf etwas anderes als Dateien bezieht, wie z. B. apt-get-Pakete.
Kevin Keane
3
@KevinKeane, rmkeine Dateinamenerweiterung ... rm "foo*"würde versuchen, eine Datei mit einem wörtlichen Stern im Namen zu entfernen.
ilkkachu

Antworten:

20

Nein. Normales Globbing *ist nicht rekursiv und ist es auch nicht rm.

Wenn ein Verzeichnisname übereinstimmt, wird er nicht entfernt - Sie benötigen das -rFlag, um ein Verzeichnis zu löschen.

Wenn Sie also sicher sind, dass Sie diese Dateien löschen möchten, ist dies sicher.

Sie können auch rminteraktiv machen

rm -i wordpress-*.sql

Anschließend werden Sie vor dem Löschen der einzelnen Dateien um Bestätigung gebeten

Zanna
quelle
14

Ja, es macht den Trick für Sie und entfernt alle Dateien mit diesem Schema im aktuellen Verzeichnis. Und NEIN, es werden keine Dateien in den Unterverzeichnissen entfernt.

Wann immer Sie nicht sicher sind, was passiert, wenn Sie einen Befehl ausführen wie:

rm wordpress-*.sql

dann starte es einfach mit ls:

ls wordpress-*.sql

Die Dateien, die Sie in der Ausgabe sehen, werden entfernt.

Wenn Sie versuchen, eine Liste wie: zu erhalten foo*, ist es besser, -dswitch with lszu verwenden, um zu verhindern, dass Dateien mit einem Verzeichnis namens foobar/etc. aufgelistet werden .

ls -d foo*

Dieser Trick funktioniert für Befehle, die nicht zur rekursiven Ausführung der Aufgabe verwendet werden.

Sie können auch die gewünschte Eingabe eingeben, z. B .: wordpress-*Drücken Sie dann Ctrl+ Alt+ *, und alle Übereinstimmungen werden automatisch vor Ihrem Befehl eingegeben.

Ravexina
quelle
4
Meine Lieblingsmethode:printf "%s\n" wordpress-*.sql
wjandrea
1
Sie können auch so tun, als ob Sie Echo mögen echo rm file*. -rf
Achten Sie
@eckes: Sie können diese mit rm ./*oder sicherer abdecken rm -- *.
David Foerster
Ja, oder benutze xargs -0@DavidFoerster
eckes
Wenn Sie gehen ls foo*und ein Verzeichnis haben, das aufgerufen wird foobar, erhalten Sie auch eine Auflistung des Inhalts dieses Verzeichnisses. Es ist also lsnicht wirklich der beste Weg, um das zu erreichen, was der rmWille schlägt
ilkkachu
12

Nein, rmnicht durch Unterverzeichnisse rekursiv.

Informationen zum Löschen von Dateien in Unterverzeichnissen finden Sie unter Löschen übereinstimmender Dateien in allen Unterverzeichnissen - SuperUser .

Wenn Sie aus Versehen etwas Wichtiges löschen möchten, verwenden Sie gvfs-trash(wodurch Dateien in den Papierkorb verschoben werden) anstelle von rm(wodurch Dateien dauerhaft gelöscht werden).

wjandrea
quelle
Vielen Dank für die gvfs-trashErwähnung etwas gelernt heute kaum verwenden ...
George Udosen
-1

Wenn Sie alle übereinstimmenden Dateien wie finden und löschen möchten wordpress-*.sql, können Sie den findBefehl verwenden. :)

Zum Beispiel möchten Sie alle übereinstimmenden Dateien mit wordpress-*.sqlunter entfernen. Gehen test_dirSie wie folgt vor.

cd test_dir
find . -name "wordpress-*.sql" -exec rm -f {} \;

Wenn das findProgramm wirklich eine passende Datei findet, versucht es, einen Befehl auszuführen, der der -execOption after folgt . In diesem Fall rm -f {}wird ausgeführt und {}in den Namen der Übereinstimmungsdatei geändert. Z.B

rm -f wordpress-169.sql

Sie können auch die Tiefe der Unterverzeichnisse mit der -maxdepthOption einstellen .

cd test_dir
find . -maxdepth 3 -name "wordpress-*.sql" -exec rm -f {} \;

Bitte beachten Sie, dass Sie die -maxdepthOption vor anderen Optionen angeben müssen . Ansonsten könnten Sie die Ergebnisse treffen, die Sie wirklich nicht sehen wollen.

Sung-Jin Park
quelle
1
OP will das Gegenteil: nicht in Unterverzeichnisse zurückkehren.
Melebius
2
GNU find: "Die Optionen wirken sich auf alle Tests aus, einschließlich der Tests, die vor der Option angegeben wurden -maxdepth." Verwenden Sie -exec rm -f {} +statt -exec \;oder noch besser nur-delete
ilkkachu