Come posso rinominare tutti i file di immagine all'interno di una directory (e ricorsivamente all'interno delle sue sottodirectory)?


0

Ho una directory che contiene un gran numero di file di immagine, alcuni dei quali sono in sottodirectory. Devo rinominare tutti i file immagine corrispondenti *.png, *.jpg, *.jpeg, *.bmp, *.gif utilizzando un modello semplice per rinominare:

  • lo stesso prefisso per tutti i file;
  • un numero con padding zeri e stampato come stringa esadecimale.

Il mio obiettivo è quello di assegnare un nome univoco a tutti i file immagine, indipendentemente dalla loro estensione, in modo da poterli poi convertire nello stesso formato immagine senza il rischio di sovrascrivere quei file con lo stesso nome.

Stavo scrivendo una sceneggiatura per eseguire la suddetta procedura (per l'elenco delle directory, mi sono ispirato al frammento di codice di questa risposta ).

for root, dirs, filenames in os.walk(path):
    for filename in filenames:
        if filename.endswith((".jpeg", ".jpg", ".png", ".gif", ".bmp")):
            # rename file

Mi stavo chiedendo se ci fosse un comando bash o powershell al fine di eseguire la procedura di cui sopra.

Risposte:


1

Sono molto fluente in Bash, ma sono sicuro che potresti fare la stessa cosa in Power Shell. Suppongo che tu voglia convertire in formato .jpg e archiviare tutti i file in una directory ./output/. Il mio script sarebbe simile a questo:

j=0;
for i in `find . -type f \( -iname *.jpg -o -iname *.jpeg -o -iname *.png -o -iname *.gif -o -iname *.bmp \)`
do
    j=$(($j+1))
    convert $i output/`printf "%06X" $j`.jpg
done

Questo script avvierà un contatore '$ j' da 0. Quindi trova tutti i file che sono di tipo file (piuttosto che le directory o i collegamenti simbolici o altre cose simili) e corrispondono alle estensioni specificate in modo non sensibile al maiuscolo / minuscolo. () Raggruppa una serie di elementi che vengono uniti insieme con uno specificatore OR -o per il comando find.

Usiamo un ciclo for per esaminare tutti i file trovati notandoli con $ i.

All'interno del ciclo, incremento il contatore $ j.

Poi converto il nome del file come l'ho trovato in .jpg e l'output nella directory ./output/.

Il nome file con numero esadecimale è composto da 0 a sei cifre utilizzando un comando printf.

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.