Benennen Sie Dateien um, indem Sie eine Zahl innerhalb des Dateinamens erhöhen


13

Ich habe ein Verzeichnis, das nummerierte Bilddateien enthält, ungefähr so:

01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png

Manchmal gibt es mehrere Versionen einer Datei in verschiedenen Formaten (z. B. a pngund svgVersion der obigen Dateien 03und 09), aber die Nummern sind ansonsten aufeinanderfolgend. Normalerweise befinden sich in jedem Verzeichnis 40-80 solcher Dateien. Die Zahlen entsprechen der Reihenfolge, in der diese Bilder in einem Manuskript erscheinen (ein Word-Dokument, aber das ist nicht wichtig). Es gibt keine andere Möglichkeit, die Reihenfolge der Bilder zu bestimmen.

Wenn ich dem Manuskript ein neues Bild hinzufüge, muss ich eine Kopie des Bildes mit der richtigen Nummerierung in dieses Verzeichnis legen. Wenn das neue Bild das fünfte im Manuskript ist, muss ich die Dateien im Verzeichnis in dieses umbenennen, um Platz dafür zu schaffen:

01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png

Was ist der einfachste Weg über die Befehlszeile oder über ein Skript oder Makro, um alle Dateien ab einer bestimmten Nummer neu zu nummerieren? Ich habe eine Standard-Fedora Linux-Installation mit Bash.

Antworten:


10

Ich denke, dass es die Arbeit machen sollte:

#!/bin/bash

NEWFILE=$1

for file in `ls|sort -g -r`
do
    filename=$(basename "$file")
    extension=${filename##*.}
    filename=${filename%.*}

    if [ $filename -ge $NEWFILE ]
    then
        mv "$file" "$(($filename + 1))".$extension
    fi
done

Das Skript verwendet einen Parameter - die Anzahl Ihrer neuen Bilder.

PS. Legen Sie das Skript in einem anderen Verzeichnis als Ihren Bildern ab. Im Bilderverzeichnis sollten nur Bilder vorhanden sein, die auf diese Weise benannt wurden, die Sie beschrieben haben.


Das sieht vielversprechend aus, ich werde es in ein paar Stunden versuchen, wenn ich wieder auf meinem Laptop bin.
Robertc

Dies funktioniert nur, wenn Ihrem Dateinamen keine nicht
numerischen

@mems Das OP gibt eindeutig an, dass Dateinamen mit einer Nummer beginnen
xhienne

2

Dies wäre in zsh einfacher, wo Sie verwenden können

  • das On Glob-Qualifikationsmerkmal zum Sortieren von Übereinstimmungen in absteigender Reihenfolge (und nzum Verwenden der numerischen Reihenfolge, falls die Dateinamen nicht alle führende Nullen mit derselben Breite haben);
  • das (l:WIDTH::FILLER:) Parametererweiterungsflag , um alle Zahlen auf die gleiche Breite (die Breite der größeren Zahl) aufzufüllen.
break=$1   # the position at which you want to insert a file
setopt extended_glob
width=
for x in [0-9]*(nOn); do
  n=${x%%[^0-9]*}
  if ((n < break)); then break; fi
  ((++n))
  [[ -n $width ]] || width=${#n}
  mv $x ${(l:$width::0:)n}${x##${x%%[^0-9]*}}
done

In Bash ist hier ein Skript, das davon ausgeht, dass Dateien auf eine feste Breite aufgefüllt werden (andernfalls benennt das Skript die richtigen Dateien nicht um) und auf eine feste Breite aufgefüllt werden (die angegeben werden muss).

break=$1      # the position at which you want to insert a file
width=9999    # the number of digits to pad numbers to
files=([0-9]*)
for ((i=#((${#files}-1)); i>=0; --i)); do
  n=${x%%[^0-9]*}
  x=${files[$i]}
  if ((n < break)); then continue; fi
  n=$((n + 1 + width + 1)); n=${n#1}
  mv -- "${files[$i]}" "$n${x##${x%%[^0-9]*}}"
done

1

Dieses genaue Problem wird in diesem Artikel behandelt . Beachten Sie, dass Sie es ändern müssen, um die SVG- und PNG-Formate zu unterstützen, indem Sie einen zweiten MV-Schritt hinzufügen.


Ich denke nicht, dass es das genaue Problem ist, das jedes Mal alle Bilder neu nummeriert. Ich möchte nur die Bilder von einem bestimmten Punkt aus neu nummerieren.
Robertc

1

Einfacher:

touch file`ls file* | wc -l`.ext

Du wirst kriegen:

$ ls file*
file0.ext  file1.ext  file2.ext  file3.ext  file4.ext  file5.ext  file6.ext

Wie würde ich die führende Null für 1-9 addieren? Denken Sie auch daran, dass möglicherweise zwei Dateien 03.png und 03.svg vorhanden sind.
Robertc

1

Es scheint in letzter Zeit kein großes Interesse an dieser Frage zu geben, aber sollte jemand darauf stoßen, gibt es hier drei Probleme. Eine Möglichkeit besteht darin, Dateien auszuwählen, die anhand semantischer Kriterien umbenannt werden sollen (der Bereich ist nicht lexikalisch und kann nicht durch Platzhalter oder sogar reguläre Ausdrücke angegeben werden - die Automatentheorie besagt, dass dies komplexer ist als eine NFA). Das zweite ist, wie man einen Namen ändert, indem man einen Teil davon ändert. Das dritte ist, wie man eine Namenskollision vermeidet. Ein Skript in Bash und vielen anderen Sprachen kann diese spezifische Transformation durchführen, aber die meisten von uns möchten lieber nicht jedes Mal ein Programm schreiben, wenn sie eine Reihe von Dateien umbenennen möchten. Mit meiner (kostenlosen und Open Source) rene.py können Sie tun, was Sie wollen, aber es sind zwei Aufrufe erforderlich, um das Problem der Namenskollision zu vermeiden. Zuerstrene ?.*/#7-80 %?.* BErhöht alle Namen im Bereich und fügt ein Präfix von% hinzu, um vorhandene Namen zu vermeiden. Dann rene %* *entfernt diesen Präfix aus diesen Dateien , die es haben. Ich beschreibe dies unter https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.