Antworten:
Wenn Dateinamen fortlaufend nummeriert sind, führen Sie einfach den folgenden Befehl aus:
rm fileName_{100..100000}
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.
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.
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.
Verwenden Sie den folgenden Befehl:
find . -name 'fileName_[100-100000]' -exec rm {} \;
Dadurch werden Dateien von 100 bis 100000 gelöscht.
Weitere Informationen: Site
[100-100000] Zeichenklasse stimmt nur mit einem einzelnen Zeichen überein, daher kann sie nur mit 0 oder 1
{x..y}auf die gesamte Liste erweitert. Wenn Sieecho test{1..3}es beispielsweise verwenden , wird es erweitertecho test1 test2 test3und dann ausgeführt. Wie Sie sehen können, wird gedruckttest1 test2 test3. Wenn das{x..y}nicht mit einem Argument verbunden ist, werden nur die Zahlen dort abgelegt. ZBecho test {1..3}wird nur gedruckttest 1 2 3.