Löschen bestimmter Dateien in der Befehlszeile

8

Ich habe Dateien Dateiname_1 , Dateiname_2 ... Dateiname_100000, wobei die Dateinamen fortlaufend nummeriert sind. Wie kann ich Indexdateien löschen, die größer als beispielsweise 100 sind ?

teaLeef
quelle

Antworten:

17

Wenn Dateinamen fortlaufend nummeriert sind, führen Sie einfach den folgenden Befehl aus:

rm fileName_{100..100000}
cioby23
quelle
3
Info: Dies funktioniert, weil bash (Ihre Shell) das {x..y}auf die gesamte Liste erweitert. Wenn Sie echo test{1..3}es beispielsweise verwenden , wird es erweitert echo test1 test2 test3und dann ausgeführt. Wie Sie sehen können, wird gedruckt test1 test2 test3. Wenn das {x..y}nicht mit einem Argument verbunden ist, werden nur die Zahlen dort abgelegt. ZB echo test {1..3}wird nur gedruckt test 1 2 3.
Luc
1
Hinweis: Durch den execAufruf wird die Anzahl der Argumente, die ein Prozess haben kann, begrenzt. Sie können es mit abrufen getconf ARG_MAX. Zum Beispiel auf meinem System sind es 2097152(~ 2,1 Millionen). Dies bedeutet, dass rm(was nicht integriert ist) mit mehr als so vielen Dateien fehlschlägt. Integrierte Befehle haben dieses Problem nicht und die anderen vorgeschlagenen Lösungen auch nicht.
Bakuriu
Beachten Sie, dass ARG_MAX eine Anzahl von Bytes und keine Anzahl von Argumenten ist. rm kann das gleichzeitige Löschen von 2097152-Dateien nicht verarbeiten. Es konnte 2048 Dateien löschen, deren Name jeweils 1023 Byte lang war (nicht 1024; die Trennzeichen zwischen den Argumenten (\ 0 in C-Land) zählen zum Limit).
Godlygeek
6

Sie können diesen Befehl auch versuchen,

for i in $(seq 100 100000); do rm fileName_$i; done

Alle Dateien (im Bereich von 100 bis 100000) werden gelöscht, wenn der Dateiname Zahlen in einer sequentiellen Reihenfolge enthält.

Avinash Raj
quelle
5

Im Allgemeinen haben Sie mehrere Möglichkeiten, dies zu erreichen:

rm fileName_{100..100000}

wird von der Shell auf rund 100.000 Dateinamen erweitert. Wenn der Basisname ein langer Pfad ist und die Anzahl hoch genug ist, können Sie mit diesem Ansatz möglicherweise die maximale Länge einer Befehlszeile überschreiten.

Die forSchleife

for i in $(seq 100 100000); do rm fileName_$i; done

leidet nicht unter diesem Problem, ist jedoch eine relativ langsame Methode zum Löschen der Dateien, da die Shell die Variablensubstitution durchführen und rm etwa 100.000 Mal starten muss.

Beide oben genannten Methoden können Warnungen auslösen, wenn beispielsweise einige der Dateien filename_101fehlen.

Normalerweise Lösungen auf Basis findsind besser, da sie nur die Arbeit an Dateien , die tatsächlich gibt es (bei Entdeckung). Es gibt jedoch einige subtile Unterschiede:

find . -name 'fileName_[100-100000]' -exec rm {} \;

wird immer noch das Start - rmProgramm über 100.000 Mal, während der endgültigen ersetzt \;durch +versuchen , die Anzahl der Teilprozesse zu minimieren. Beide Methoden sind wahrscheinlich (viel oder ein bisschen) langsamer als die Verwendung, bei -deleteder überhaupt keine externen Befehle verwendet werden, sondern stattdessen Systemaufrufe aufgerufen werden.

Überprüfen Sie jedoch immer zuerst, ob das Muster tatsächlich mit den Dateien übereinstimmt, auf die Sie abzielen möchten:

stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]' 
askubuntu/filename_1

In diesem Fall würden Sie also eine Datei löschen, die Sie behalten möchten, und die Dateien belassen, die entfernt werden sollten.

Stefan Schmiedl
quelle
4

Verwenden Sie den folgenden Befehl:

find . -name 'fileName_[100-100000]' -exec rm {} \;

Dadurch werden Dateien von 100 bis 100000 gelöscht.

Weitere Informationen: Site

nux
quelle
Sie sollten lieber verwenden +als \;- siehe hier . Oder, noch besser, verwenden Sie den -deleteBefehl find .
Evilsoup
Ich habe dies getestet und nur fileName_1 gelöscht. Die [100-100000] Zeichenklasse stimmt nur mit einem einzelnen Zeichen überein, daher kann sie nur mit 0 oder 1
übereinstimmen.