Wie kann ich alle Dateien mit einer bestimmten Erweiterung in einem bestimmten Ordner löschen?
36
Wenn ich das aktuelle / Arbeitsverzeichnis cdauf ein bestimmtes Verzeichnis setze (indem ich dorthin navigiere ) und dann tippe:
rm *.xvg
Was wird dieser Befehl tun? Stimmt es, dass der obige Befehl nur Dateien mit der Erweiterung .xvgnur im Arbeitsverzeichnis löscht ?
Ich war nervös, dies zu versuchen, bevor ich gefragt habe, da ich absolut sicher sein möchte, dass der obige Befehl nur .xvgDateien löscht , die sich im ARBEITSVERZEICHNIS befinden .
Ja, rm *.xvgwird nur die Dateien mit der angegebenen Erweiterung in Ihrem löschen aktuelles Verzeichnis.
Ein guter Weg , um sicherzustellen , dass Sie in der Tat in dem Verzeichnis , das Sie Ihre Dateien löschen möchten , ist es, die verwenden pwdBefehl, der das aktuelle Verzeichnis angezeigt wird und dann ein tun , lsum die Dateien , die Sie erwarten , finden zu überprüfen.
Wenn Sie etwas besorgt über die Ausgabe des rmBefehls sind, können Sie zwei Dinge tun:
Geben Sie ein ls *.xvg, um eine Liste der Dateien anzuzeigen, auf die sich dieser Befehl auswirkt.
Sofern Sie nicht über viele Dateien verfügen , können Sie auch die -iBefehlszeilenoption für verwenden rm(ist auch für cpund vorhanden mv). Wenn rm -i *.xvgSie verwenden, werden Sie für jede einzelne Datei aufgefordert, sie zu löschen, damit Sie sicher sein können, dass nichts, was Sie nicht erwartet hatten, gelöscht wird. (Dies ist jedoch mühsam, wenn Sie viele Dateien haben :)
Also: rm -f {*.xvg,.*.xvg}um auch versteckte Dateien zu entfernen. Und rm -R -f {*.xvg,.*.xvg}auch Verzeichnisse zu entfernen.
Dor
20
Sie müssen nicht zum Verzeichnis navigieren, sondern verwenden
rm /some/dir/*.xvg
In dem Fall, dass Sie einen Tippfehler oder einen ähnlichen Fehler im Pfad haben, in dem / som / dir nicht existiert:
cd /som/dir
rm *.xvg
löscht versehentlich alle .xvg-Dateien im aktuellen Verzeichnis. Der erste Befehl wird nicht ausgeführt, und Sie müssen nicht erneut eine CD erstellen.
Eine alternative Möglichkeit wäre, find zu verwenden:
find /some/dir/-maxdepth 1-type f -name "*.xvg"-delete
find / some / dir / -maxdepth 1 -type f -name "* .xvg" -löschen hat bei mir funktioniert! Verwenden Sie -maxdepth "n", um übereinstimmende Dateien im Unterverzeichnis zu löschen, wenn der Pfad angegeben wurde
Vinay
3
Ja, rm *.xvglöscht nur Dateien, die mit .xvgIhrem aktuellen Verzeichnis enden . Hier ist der Grund.
Wenn Sie einen Befehl wie diesen eingeben, wird die Arbeit zwischen der verwendeten Shell (nehmen wir bash an) und dem Befehl binary aufgeteilt.
Sie können die Binärdatei finden, indem Sie Folgendes eingeben which rm. Dieses kleine Programm kümmert sich um das Aufheben der Verknüpfung von Dateien. Programme wie dieses können von der Kommandozeile aus gestartet werden und können prog arg1 arg2 arg3beim Start eine Liste von Argumenten lesen . In diesem Fall rmwerden sie als Liste vollqualifizierter Dateinamen interpretiert, die gelöscht werden sollen. Wenn Sie sich also in einem Verzeichnis befinden, das die Datei enthält foo.bar, führt die Eingabe delete 'foo.*'zu rm: foo.*: No such file or directory. Beachten Sie die einfachen Anführungszeichen um das Dateimuster. Sie weisen die Shell an, das Argument unverändert an die Shell zu übergeben.
Wenn Sie jedoch rm *.bardasselbe Verzeichnis eingeben, wird die Datei gelöscht. Was hier passiert, ist, dass Ihre Shell, dh das Programm, mit dem Sie Befehle eingeben, einige Transformationen ausführt, bevor die Argumente an den Befehl übergeben werden. Eine davon wird als "Dateinamenerweiterung" oder "Globbing" bezeichnet. Sie können eine Liste von bash Dateinamen - Erweiterungen finden Sie hier . Eine der häufigsten Erweiterungen ist *die Erweiterung auf Dateinamen im aktuellen Verzeichnis.
Ein einfacher Weg, um Globs bei der Arbeit zu betrachten, ist die Verwendung echo, die alle Argumente ausgibt , die ihr durch die Shell übergeben wurden. Wenn Sie also echo *in dasselbe Verzeichnis tippen, wird dies ausgegeben foo.bar. Wenn Sie also tippen rm *.bar, geschieht tatsächlich, dass die Shell die Argumentliste auf erweitert foo.barund diese dann an den rmBefehl übergibt .
Es gibt verschiedene Möglichkeiten, das Globbing zu steuern. In neueren Versionen von bash können Sie beispielsweise eine Option namens globstar aktivieren, die eine rekursive Erweiterung vornimmt. Tippenecho **/*.bar wird eine Liste aller Dateien angezeigt, die .barin allen Unterordnern enden . rm **/*.barWenn Sie also globstar-fähige Bash eingeben, werden in der Tat alle übereinstimmenden Dateien in den Unterordnern rekursiv gelöscht.
rm -f {*.xvg,.*.xvg}
um auch versteckte Dateien zu entfernen. Undrm -R -f {*.xvg,.*.xvg}
auch Verzeichnisse zu entfernen.Sie müssen nicht zum Verzeichnis navigieren, sondern verwenden
In dem Fall, dass Sie einen Tippfehler oder einen ähnlichen Fehler im Pfad haben, in dem / som / dir nicht existiert:
löscht versehentlich alle .xvg-Dateien im aktuellen Verzeichnis. Der erste Befehl wird nicht ausgeführt, und Sie müssen nicht erneut eine CD erstellen.
Eine alternative Möglichkeit wäre, find zu verwenden:
quelle
Ja,
rm *.xvg
löscht nur Dateien, die mit.xvg
Ihrem aktuellen Verzeichnis enden . Hier ist der Grund.Wenn Sie einen Befehl wie diesen eingeben, wird die Arbeit zwischen der verwendeten Shell (nehmen wir bash an) und dem Befehl binary aufgeteilt.
Sie können die Binärdatei finden, indem Sie Folgendes eingeben
which rm
. Dieses kleine Programm kümmert sich um das Aufheben der Verknüpfung von Dateien. Programme wie dieses können von der Kommandozeile aus gestartet werden und könnenprog arg1 arg2 arg3
beim Start eine Liste von Argumenten lesen . In diesem Fallrm
werden sie als Liste vollqualifizierter Dateinamen interpretiert, die gelöscht werden sollen. Wenn Sie sich also in einem Verzeichnis befinden, das die Datei enthältfoo.bar
, führt die Eingabedelete 'foo.*'
zurm: foo.*: No such file or directory
. Beachten Sie die einfachen Anführungszeichen um das Dateimuster. Sie weisen die Shell an, das Argument unverändert an die Shell zu übergeben.Wenn Sie jedoch
rm *.bar
dasselbe Verzeichnis eingeben, wird die Datei gelöscht. Was hier passiert, ist, dass Ihre Shell, dh das Programm, mit dem Sie Befehle eingeben, einige Transformationen ausführt, bevor die Argumente an den Befehl übergeben werden. Eine davon wird als "Dateinamenerweiterung" oder "Globbing" bezeichnet. Sie können eine Liste von bash Dateinamen - Erweiterungen finden Sie hier . Eine der häufigsten Erweiterungen ist*
die Erweiterung auf Dateinamen im aktuellen Verzeichnis.Ein einfacher Weg, um Globs bei der Arbeit zu betrachten, ist die Verwendung
echo
, die alle Argumente ausgibt , die ihr durch die Shell übergeben wurden. Wenn Sie alsoecho *
in dasselbe Verzeichnis tippen, wird dies ausgegebenfoo.bar
. Wenn Sie also tippenrm *.bar
, geschieht tatsächlich, dass die Shell die Argumentliste auf erweitertfoo.bar
und diese dann an denrm
Befehl übergibt .Es gibt verschiedene Möglichkeiten, das Globbing zu steuern. In neueren Versionen von bash können Sie beispielsweise eine Option namens globstar aktivieren, die eine rekursive Erweiterung vornimmt. Tippen
echo **/*.bar
wird eine Liste aller Dateien angezeigt, die.bar
in allen Unterordnern enden .rm **/*.bar
Wenn Sie also globstar-fähige Bash eingeben, werden in der Tat alle übereinstimmenden Dateien in den Unterordnern rekursiv gelöscht.quelle
Befehl :
funktioniert bei mir
Befehl:
gibt einen Fehlerbefehl (auf Polnisch, übersetzt):
im
quelle