Rinominare centinaia di file contemporaneamente per un corretto ordinamento


23

Ho un sacco di file, tutte le cose di nome come 1.jpg, 2.jpg, 3.jpge così via fino a 1439.jpg, però, ho un problema con uno dei miei progetti e ordinatore. E di solito andare in ordine 1.jpg, 10.jpg,11.jpg e così via.

Quello di cui ho bisogno è un modo per dare un nome ai file in modo che siano nel formato 00001.jpgfino a quel momento 01439.jpg.

Come sarei in grado di farlo in modo rapido ed efficiente?


Quello che stai cercando è "ordinamento naturale", forse questo aiuta: askubuntu.com/questions/41390/…
Fabian Blechschmidt,

Risposta che non è una risposta diretta? ls -v unix.stackexchange.com/questions/33909/…
WernerCD,

+1 perché ho provato a farlo senza successo pyrenamer.
Parto,

@FabianBlechschmidt, ne ho bisogno in un programma che non è per nautilus o simili. È per un singolo progetto.
Kaz Wolfe,

Penso che hai pensato di implementare l'ordinamento naturale? Ma capisco, rinominare i file è abbastanza facile e se fa il lavoro, fantastico :)
Fabian Blechschmidt,

Risposte:


35

Ubuntu viene fornito con uno script chiamato rename. È solo un piccolo script Perl che presenta una serie di potenti funzioni di ridenominazione in blocco, ma la migliore (in questo caso) è la capacità di eseguire Perl durante la sostituzione. Il risultato è una soluzione davvero compatta:

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

Questo è simile alle printfrisposte di altro tipo qui, ma è tutto gestito per noi. Il codice sopra è per un numero di 5 cifre (incluso un numero variabile di zeri iniziali).

Cercherà e sostituirà la prima stringa numerica che trova con una versione con spaziatura zero e lascerà solo il resto del nome file. Ciò significa che non devi preoccuparti troppo di trasferire estensioni o prefissi.

Nota: questo non è completamente portatile. Molte distribuzioni usano rename.uldal util-linuxpacchetto come renamebinario predefinito . Questa è un'alternativa significativamente stentata (vedi man rename.ul) che non capirà quanto sopra. Se lo desideri su una piattaforma che non utilizza la ridenominazione di Perl, scopri prima come installarlo.


Ed ecco un cablaggio di prova:

$ touch {1..19}.jpg

$ ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  1.jpg  3.jpg  5.jpg  7.jpg  9.jpg
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  2.jpg  4.jpg  6.jpg  8.jpg

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

$ ls
00001.jpg  00005.jpg  00009.jpg  00013.jpg  00017.jpg
00002.jpg  00006.jpg  00010.jpg  00014.jpg  00018.jpg
00003.jpg  00007.jpg  00011.jpg  00015.jpg  00019.jpg
00004.jpg  00008.jpg  00012.jpg  00016.jpg

E un prefisso di esempio (non stiamo facendo nulla di diverso):

$ touch track_{9..11}.mp3 && ls
track_10.mp3  track_11.mp3  track_9.mp3

$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3  track_10.mp3  track_11.mp3

Se fossi una persona Perl sarebbe la soluzione perfetta. Davvero pulito.
MGP,

2
Non utilizza alcun perl, solo uno strumento fornito che è già scritto in perl.
Rob,

1
In questo caso si fa coinvolgere un singolo comando Perl ma non è esattamente sollevamento di carichi pesanti. sprintfin Perl si comporta in modo simile ad sprintfaltre lingue.
Oli

21
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then  mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

modificare

Spiegazione:

  • if [[ $f =~ [0-9]+\. ]] si assicura che vengano rinominati solo i file i cui nomi sono numeri (seguiti da un punto).
  • printf "%.5d" NUMBER aggiunge gli zeri iniziali
  • "${f%.*}" taglia l'estensione (.jpg) e lascia solo il numero
  • .jpgdopo il secondo backtick aggiunge nuovamente l'estensione del file.

Nota che funzionerà solo con nomi di file che sono numeri. Il riempimento a sinistra degli zeri iniziali verso i file non numerati richiederebbe un formato diverso.

Se vuoi sperimentare prova questo comando:

for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

Modifica 2

Rendere il comando più sicuro assicurandosi che vengano rinominati solo i nomi file che sono numeri. Si noti che tutti i file preesistenti denominati come 00001.jpg verranno sovrascritti.


Questo script da copertina funziona "out of box" su Ubuntu e altre distribuzioni Linux! 😃 Non è necessario installare strumenti aggiuntivi utilizzando perl, python, ecc.
HEXcube

6

Sotto uno script Python.

Lo script aggiunge gli zeri iniziali fino al numero definito di cifre. Se il nome è più grande di quello, il file (nome) non viene toccato.

La combinazione di estensioni diverse in un'azione di ridenominazione potrebbe aggiungere un certo vantaggio. Per aggiungere l'estensione (i), semplicemente aggiungerli alla tupla, per esempio extensions = (".jpg", ".jpeg", ".tiff").

Copia il testo in un file vuoto, salvalo come rename.py, inserisci il percorso corretto nella directory dei file ( sourcedir), il numero di cifre che desideri che i nuovi nomi abbiano ( number_ofdigits) e l'estensione / i file da rinominare ( extensions)

Eseguilo con il comando:

python3 /path/to/script/rename.py

Il copione:

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")

files = os.listdir(sourcedir)
for item in files:
    if item.endswith(extensions):
        name = item.split("."); zeros = number_ofdigits-len(name[0])
        newname = str(zeros*"0")+name[0]+"."+name[1]
        shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)

modificare:

Di seguito una versione leggermente migliorata. Determina automaticamente il nome più lungo nella directory e aggiunge gli zeri iniziali fino alla lunghezza del nome più lungo.

esempio:

1.jpg
12.jpg
123.jpg

diventa:

001.jpg
012.jpg
123.jpg

Non è necessario impostare il numero di cifre.

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))

for item in files:
    zeros = maxlen-len(item[2])
    shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])

2

Esiste un'utilità di ridenominazione implementata in Perl che rende tutto molto semplice:

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

Il primo argomento è un'espressione Perl che viene valutata per ciascun nome di file.


0

C'è una GUI che lo farà chiamato pyRenamer che può essere trovata nei repository. Installa, avvia, seleziona la tua directory e imposta semplicemente "Pattern nome file rinominato" su "{num5}" nella scheda "Patterns" e fai clic sul pulsante "Rinomina". Puoi anche vedere in anteprima cosa accadrà prima di rinominare.


Mentre la tua risposta FUNZIONA, tieni presente che questa è una shell-scripting sezione, il che significa che sto cercando una risposta da riga di comando. Inoltre, puoi fornire maggiori dettagli sul programma? Ad esempio, che formato di modello è {num5}?
Kaz Wolfe,

-4
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`     
do    
  mv $file "000"$file    
done

Questo è rozzo, dal momento che non fa la ridenominazione in modo intelligente, dovrà pensare a un trucco per quello. Ma dovrebbe aiutarti a ordinare le cose.

Aggiornamento: hai una risposta più completa.


2
rinomina 1439.jpg come 0001439.jpg.
Avinash Raj,

Sì, lo so, ho riempito solo zeri extra che dovrebbero comunque funzionare con il tipo.
Swarnendu Biswas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.