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 .xvg nur 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 .

Antworten:


34

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:

  1. Geben Sie ein ls *.xvg, um eine Liste der Dateien anzuzeigen, auf die sich dieser Befehl auswirkt.

  2. 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 :)


1
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.


1

Befehl :

  rm ./*.pgm

funktioniert bei mir

Befehl:

rm *.pgm

gibt einen Fehlerbefehl (auf Polnisch, übersetzt):

rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.

im

bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.