Ich habe folderA
einige Dateien mit einer Zahlenfolge, die mit beginnt a_000000
. Ich möchte Dateien löschen, die ab einer bestimmten Nummer beginnen, also a_000750
bis 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 find
listet 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) 000750
oder größer ist, wird die Datei gelöscht. Das -v
ist 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 201
vor in steht 31
, aber nicht vor 031
.
Testen Sie dies mit dem echo
Befehl 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