Benennen Sie Dateien um, um Zahlen führende Nullen hinzuzufügen

9

Ich habe einige Beispiele für den Befehl zum Umbenennen ausprobiert, aber ich kann die Syntax nicht herausfinden, um das zu tun, was ich will.

Ich habe eine Reihe von Dateien mit der Bezeichnung "So etwas"

File_Ex_1.jpg
File_Ex_2.jpg
File_Ex_3.jpg
File_Ex_4.jpg
...
File_Ex_10.jpg
File_Ex_11.jpg
etc. 

Ich möchte nur einige davon ändern, indem ich ein 0einfüge, damit die Dateinamen die gleiche Anzahl von Zeichen haben.

Also möchte File_Ex_1.jpgich zu File_Ex_01.jpg, File_Ex_2.jpgzu gehenFile_Ex_02.jpg

Wie machen Sie das mit dem Befehl umbenennen?

Dieser renameBefehl wurde über Home-Brew auf einem Mac installiert . Ausgabe von rename -v:

rename -v
Usage:
    rename [switches|transforms] [files]

    Switches:

    -0/--null (when reading from STDIN)
    -f/--force or -i/--interactive (proceed or prompt when overwriting)
Wide character in print at /System/Library/Perl/5.18/Pod/Text.pm line 286.

    -g/--glob (expand "*" etc. in filenames, useful in Windows™ CMD.EXE)
    -k/--backwards/--reverse-order
    -l/--symlink or -L/--hardlink
    -M/--use=*Module*
    -n/--just-print/--dry-run
    -N/--counter-format
    -p/--mkpath/--make-dirs
    --stdin/--no-stdin
    -t/--sort-time
    -T/--transcode=*encoding*
    -v/--verbose

    Transforms, applied sequentially:

    -a/--append=*str*
    -A/--prepend=*str*
    -c/--lower-case
    -C/--upper-case
    -d/--delete=*str*
    -D/--delete-all=*str*
    -e/--expr=*code*
    -P/--pipe=*cmd*
    -s/--subst *from* *to*
    -S/--subst-all *from* *to*
    -x/--remove-extension
    -X/--keep-extension
    -z/--sanitize
    --camelcase --urlesc --nows --rews --noctrl --nometa --trim (see manual)
toombzie
quelle

Antworten:

16

Versuchen Sie es damit:

rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg

Beispiel:

$ ls
Device_Ex_10.jpg  Device_Ex_1.jpg  Device_Ex_4.jpg  Device_Ex_7.jpg
Device_Ex_11.jpg  Device_Ex_2.jpg  Device_Ex_5.jpg  Device_Ex_8.jpg
Device_Ex_12.jpg  Device_Ex_3.jpg  Device_Ex_6.jpg  Device_Ex_9.jpg
$ rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg
$ ls
Device_Ex_01.jpg  Device_Ex_04.jpg  Device_Ex_07.jpg  Device_Ex_10.jpg
Device_Ex_02.jpg  Device_Ex_05.jpg  Device_Ex_08.jpg  Device_Ex_11.jpg
Device_Ex_03.jpg  Device_Ex_06.jpg  Device_Ex_09.jpg  Device_Ex_12.jpg

Ich habe die Referenz von hier genommen: /programming/5417979/batch-rename-sequential-files-by-padding-with-zeroes

Hier an Ihre spezielle renameImplementierung angepasst .

Emilio Galarraga
quelle
Dies scheint ein richtiger Aufruf für die Perl-basierte Version des Umbenennens zu sein, die der Fragesteller anscheinend nicht hat.
Dhag
1
Gibt es eine gute Referenz, um zu erklären, was diese Befehle bedeuten? Wie das + -Zeichen. Dies ist nah, außer ich denke, das reale Format für meine Dateinamen ist Device1_Ex_1.jpg Wo diese Syntax das in Device01_Ex_1.jpg und nicht Device1_Ex_01.jpg
verwandeln
1
@dhag Der Fragesteller hat definitiv eine Perl-basierte Version, sowohl weil sie kein Linux ausführen rename, also kein Util-Linux haben , als auch weil die Ausgabe von rename -vPerl explizit erwähnt.
Gilles 'SO - hör auf böse zu sein'
1
Ja, OK, meine Formulierung war schrecklich. Ich hätte sagen sollen "die Version, die einen Perl-Ausdruck als einen ihrer Parameter akzeptiert". Das sieht immer noch nach einer falschen Antwort aus, nicht wahr?
Dhag
Interessanterweise -efunktioniert dieser Aufruf , obwohl er dem Hilfetext zu widersprechen scheint, der, wenn ich ihn richtig verstehe, vor dem Perl-Code erforderlich ist , tatsächlich mit dem Umbenennungsdienstprogramm, das mit macOS geliefert wird. Ich ziehe meinen ersten Kommentar zurück.
Dhag
2

Bei der Version der Umbenennung, die Sie anscheinend verwenden, sollte der folgende Ausdruck die von Ihnen angeforderte Transformation ausführen (z. B. ein Verzeichnis mit den genannten Dateien File_Ex_{1..11}.jpg):

$ rename -n -e 's/_(\d\.)/_0$1/g' -- *.jpg
'File_Ex_1.jpg' would be renamed to 'File_Ex_01.jpg'
'File_Ex_2.jpg' would be renamed to 'File_Ex_02.jpg'
'File_Ex_3.jpg' would be renamed to 'File_Ex_03.jpg'
'File_Ex_4.jpg' would be renamed to 'File_Ex_04.jpg'
'File_Ex_5.jpg' would be renamed to 'File_Ex_05.jpg'
'File_Ex_6.jpg' would be renamed to 'File_Ex_06.jpg'
'File_Ex_7.jpg' would be renamed to 'File_Ex_07.jpg'
'File_Ex_8.jpg' would be renamed to 'File_Ex_08.jpg'
'File_Ex_9.jpg' would be renamed to 'File_Ex_09.jpg'

(Entfernen Sie das Flag -n, um die Umbenennung durchzuführen.)

Das Argument für -eist ein Perl-Ausdruck zum Suchen und Ersetzen. Wobei _(\d\.)Übereinstimmungen ein Unterstrich sind, gefolgt von einer einzelnen Ziffer und einem Punkt, und der Unterstrich durch einen ersetzt wird _0, wodurch eine führende Null eingefügt wird. $1ist ein Rückverweis auf die Gruppe in Klammern, die Ziffer und den Punkt, und lässt sie im neuen Dateinamen unverändert.

dhag
quelle
1

Obwohl dies mit einem prenameBefehl möglich ist, möchte ich eine Python-Alternative dazu bereitstellen:

$ ls
File_Ex_1.jpg  File_Ex_2.jpg  File_Ex_3.jpg  File_Ex_4.jpg

$ ./pad_zeros.py *                                                                                                       

$ ls
File_Ex_01.jpg  File_Ex_02.jpg  File_Ex_03.jpg  File_Ex_04.jpg  pad_zeros.py*

Das pad_zeros.pySkript ist einfach:

#!/usr/bin/env python
import sys,os,re

for file in sys.argv[1:]:
    if __file__ in file: continue
    words = re.split('_|\.',file)
    words[-2] = words[-2].zfill(2)
    new_name = "_".join(words[:-1]) + "." + words[-1]
    os.rename(file,new_name)

Es nimmt Argumente in der Befehlszeile auf, iteriert über sie und füllt Nullen mit dem .zfill()Befehl auf (in diesem speziellen Fall mit zwei Zeichen). Da wir alle Dateien im selben Ordner bearbeiten, kann glob-star verwendet werden.

Sergiy Kolodyazhnyy
quelle
Dies ist die beste Antwort, die an die Anzahl der Dateien angepasst werden kann, die umbenannt werden müssen.
mLstudent33
Obwohl ich einen Anomalous backslash in string: '\g'. String constant might be missing an r prefix. (anomalous-backslash-in-string)Fehler
bekomme
konnte es nicht laufen lassen, also würde ich es tun chmod 755. und jetzt eine import-im6.q16: not authorized Bootsladung Fehler: sys '@ error / konstituieren.c / WriteImage / 1037. import-im6.q16: nicht autorisiert os' @ error/constitute.c/WriteImage/1037. import-im6.q16: not authorized re '@ error / konstituieren.c / WriteImage / 1037. ./renameLeadZero.py: Zeile 6: Syntaxfehler in der Nähe eines unerwarteten Tokens, if' ./renameLeadZero.py: line 6: wenn Datei in Datei: Fortsetzen
mLstudent33
1
@ mLstudent33 Das ist eigenartig. Der Fehler in Ihrem zweiten Kommentar ist wahrscheinlich auf einen Backslash in einem der Dateinamen zurückzuführen. Python Regex hält es für eine besondere Backslash-Flucht. Wir können wahrscheinlich umgehen , dass durch Zugabe repr()um filein re.split()Zeile oder Zeichenfolge Formatierung ( stackoverflow.com/q/18707338/3701431 ) , aber wir berücksichtigen müssen , ob sie die Python3 oder python2.7 wir auf das System haben - ihre Zeichenfolge Die Formatierung ist nur ein bisschen anders. Für den Fehler im dritten Kommentar kann ich weder bestätigen noch leugnen - habe nie mit Conda gearbeitet.
Sergiy Kolodyazhnyy
Danke für die Antwort.
mLstudent33