Bash-Skript zum Entfernen ausgewählter Dateien

Bash-Skript zum Entfernen ausgewählter Dateien

Ich habe eine Reihe von Dateien, die entsprechend benannt sind field.%d.vtkund generiert werden, wenn ich einen C++-Code ausführe. Der Code führt eine Reihe von Berechnungen in einer For-Schleife durch und gibt die Ausgabe aus, wenn i%N == 0die iSchleifenvariable und Neine Konstante ist. Aus Versehen habe ich Folgendes eingestellt N = 1und habe jetzt eine riesige Datenmenge, die ich nicht brauche. Ich möchte den Code auch nicht erneut ausführen.

Wie kann ich ein Bash-Skript schreiben, das nur alle NDateien behält, den Rest löscht und die verbleibenden Dateien so umbenennt, dass die Nummern field.%d.vtkfortlaufend sind? Tut mir leid, wenn das trivial ist, aber ich habe nur sehr begrenzte Erfahrung mit Bash-Skripten.

BEARBEITEN: Wenn N=1(aus Versehen) der Bereich %dbei [0, 1, ..., O(100.000)] (wirklich groß) liegt, Nist etwas in dieser Größenordnung geeignet N=100, wodurch die Anzahl der Dateien auf O(1000) oder so reduziert wird.

Danke

Antwort1

Wenn N=100 ist, ist es ziemlich einfach, sie zu entfernen. Im Folgenden werden alle Dateien gelöscht, die nicht mit 00.vtk enden

find -name '*.vtk' -not -name '*00.vtk' -exec rm {} +

Es blieben also 100.vtk, 200.vtk usw. übrig.

Um sie dann zusammenhängend zu machen, können Sie einfach die 00 entfernen:

rename 00.vtk .vtk *.vtk

Dies setzt eine standardmäßige POSIX-Umbenennung voraus. Wenn Sie die Perl-Umbenennung installiert haben, lautet sie:

rename 's/00.vtk/.vtk/' *.vtk

Antwort2

for i in *.vtk
do
    [[ $i =~ \.([0-9]*)\. ]] && ((BASH_REMATCH[1] % 100 != 0)) && echo $i
done

Wechseln Sie echozu rm, wenn Sie diesen Befehl noch einmal überprüft haben!

Antwort3

Nur für Bash (4+) verfügbare Version von Pauls Antwort (es werden also nur alle 100. Dateien, also diejenigen, die mit enden, als .vtk-Dateien belassen 00.vtkund durch Entfernen der ) umbenannt 00):

shopt -s extglob
rm ./!(*00).vtk
for f in ./*.vtk; do mv "$f" "${f%00.vtk}.vtk"; done

Wenn Sie Rekursivität wünschen:

shopt -s extglob globstar
rm ./**/!(*00).vtk
for f in ./**/*.vtk; do mv "$f" "${f%00.vtk}.vtk"; done

verwandte Informationen