Ich habe eine Reihe von Dateien, die entsprechend benannt sind field.%d.vtk
und 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 == 0
die i
Schleifenvariable und N
eine Konstante ist. Aus Versehen habe ich Folgendes eingestellt N = 1
und 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 N
Dateien behält, den Rest löscht und die verbleibenden Dateien so umbenennt, dass die Nummern field.%d.vtk
fortlaufend 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 %d
bei [0, 1, ..., O(100.000)] (wirklich groß) liegt, N
ist 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 echo
zu 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.vtk
und 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