Wie kann ich nummerierte Dateien in einem bestimmten Bereich löschen?

Wie kann ich nummerierte Dateien in einem bestimmten Bereich löschen?

Ich habe folderAeinige Dateien mit einer Zahlenfolge, die mit beginnt a_000000. Ich möchte Dateien löschen, die ab einer bestimmten Nummer beginnen, also a_000750bis zum Ende der Dateien in diesem folderA. Kann mir jemand erklären, wie das mit einem Shell-Skript geht?

Antwort1

Vorausgesetzt, Sie kennen oder können das Ende des Bereichs erraten, können Sie verwendenKlammererweiterungen:

rm a_{000750..000850}

Das obige löscht die 101 Dateien zwischen a_000750 und a_000850 (und beschwert sich über Dateinamen, die auf nicht vorhandene Dateien verweisen). Wenn Sie dafür zu viele Dateien haben, verwenden Sie find:

find . -name 'a_*' | while read -r file; do 
  [ "${file#./a_}" -gt 000749 ] && rm -v "$file" 
done

Hier findlistet die einfach alle Dateien auf, die mit übereinstimmen a_*. Die Liste wird an eine Schleife übergeben while, in der jeder Dateiname in die Variable eingelesen wird $file. Dann wird mit der bash-FunktionZeichenfolgenmanipulationFunktionen: Wenn der numerische Teil (find druckt Dateien als ./file, ${file#./a_}druckt also nur die Nummer) 000750oder größer ist, wird die Datei gelöscht. Das -vist nur da, damit Sie sehen können, welche Dateien entfernt wurden.

Beachten Sie, dass das Obige vernünftige Dateinamen voraussetzt. Wenn Ihre Namen Leerzeichen, Zeilenumbrüche oder andere seltsame Zeichen enthalten können, verwenden Sie stattdessen Folgendes:

find . -name 'a_*' -print0 | while IFS= read -rd '' file; do 
  [ "${file#./a_}" -gt 000749 ] && rm -v "$file" 
done

Antwort2

Sie könnten etwa Folgendes tun:

find . -regextype posix-extended -iregex './a_[0-9]{6}' -execdir bash -c '[[ ${1##./a_} > 000750 ]] && echo $1' "removing: " {} \;

Oder:

find . -regextype posix-extended -iregex './a_[0-9]{6}' | sort | sed '0,/000750/d' | xargs echo

Die erste Methode geht von einem festen Präfix aus, entfernt es und prüft den Wert.

Die zweite Methode geht von einem Suffix fester Länge (und einem gemeinsamen festen Präfix) aus und verlässt sich auf diese Tatsache; und darauf, dass es lexikografisch zwar 201vor in steht 31, aber nicht vor 031.

Testen Sie dies mit dem echoBefehl und verwenden Sie stattdessen, wenn Sie sicher sind, dass die richtigen Dateien aufgelistet werden rm.

Antwort3

In Bash können Sie Folgendes ausführen:

for i in {1001..3000} ; do rm file_"$i".dat ; done

Antwort4

So einfach wie

rm partialfilename* -f

In Ihrem Beispiel ist es

rm a_00075* -f

verwandte Informationen