it-swarm.it

Rinominare i file in batch

Ho una directory piena di immagini:

image0001.png
image0002.png
image0003.png
...

E vorrei un one-liner per rinominarli (diciamo).

0001.png
0002.png
0003.png
...

Come faccio a fare questo?

157
Internet man

Se si utilizza Bash o un'altra shell compatibile con POSIX:

for f in *.png; do
    mv -- "$f" "${f#image}"
done
110
W_Whalley

Su Debian e derivati, rename di Perl funziona in modo simile a sed in questo modo:

  rename -v 's/image//' *.png

C'è anche il rename da util-linux che funziona in questo modo, invece:

  rename image '' *.png
113
Internet man

zMV

La shell zsh ha un potente comando di rinomina batch chiamato zmv.

Per prima cosa devi abilitare il comando zmv come segue (questo può andare nel tuo ~/.zshrc).

autoload zmv

La sintassi di base è zmv PATTERN REPLACEMENT. Il modello è un'espressione glob shell. Parti del motivo possono essere racchiuse tra parentesi. Il testo sostitutivo può contenere $1, $2, ecc. per fare riferimento all'ennesimo gruppo tra parentesi nel modello. Per esempio:

zmv 'image(*.png)' '$1'

Puoi anche chiedere a zsh di definire automaticamente $1, $2, ecc. per abbinare i caratteri jolly nel modello:

zmv -w 'image*.png' '$1.png'

Normalmente utilizzo l'utilità Nice and simple mmv ( man page ) per questo caso d'uso:

$ mmv "image*.png" "#1.png"

eseguirà il tuo compito.

Il #1 nel modello di destinazione verrà sostituito con qualsiasi cosa corrisponda al carattere jolly nel modello di origine. Questo funziona anche con diversi caratteri jolly e può essere utilizzato ad esempio per modificare l'ordine delle parti dei nomi dei file. Puoi anche fare facilmente cose più complicate come convertire lettere minuscole in lettere maiuscole.

Assicurati di proteggere i motivi dalla Shell citando.

34
Marcel Stimberg

POSIX sh per loop

sa sed per rinominare

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
10
X Tian

Mi piace Perl così:

Perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

Puoi anche usare lo stesso modello per altre attività come copiare i file in un'altra directory:

Perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
6
gvkv

voto a maggioranza qualificata

Il comando qmv da renameutils apre un editor che mostra un elenco di nomi di file con due colonne, separate da una scheda. Ogni riga mostra uno dei nomi dei file, lo stesso in entrambe le colonne. La colonna di destra rappresenta i nuovi nomi dei file.
Per apportare modifiche, modifica i nomi sul lato destro. In questo esempio, :%s/... o la modalità blocco visivo sono utili.

Nomi dei file nel tuo editor

$ qmv *.png

Nell'editor:

image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

Modifica i nomi nella colonna di destra:
(Rimozione del prefisso image da tutte le righe usando la modalità blocco visivo)

image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

Registro di ridenominazione:

image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png

(ad esempio Ubuntu: apt-get install renameutils)

6
Volker Siegel

ricorsivo

ricerca semplice selezionando i file immagine * png e non presuppone la necessità di occuparsi di newline nei nomi dei file

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done

Sicuro, in grado di gestire spazi, nuove linee, barre rovesciate e quant'altro:

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done
3
X Tian

Utilizzo di espansione parentesi graffa Shell :

for N in {0001..1000}; do mv "{image,}$N.png"; done
2
αғsнιη

Prova brename ( https://github.com/shenwei356/brename ), un pratico strumento da riga di comando multipiattaforma per rinominare in batch file/directory in modo sicuro tramite espressione regolare (che supporta Windows, Linux e OS X ).

@ patrickDurusa ha detto:

Linux ha una varietà di opzioni per rinominare i file batch, ma non ho visto alcun difetto nel nome commerciale che mi è saltato fuori.

Caratteristiche:

  • Cross-platform . Supporto per Windows, Mac OS X e Linux.
  • Cassetta di sicurezza . Di verifica potenziali conflitti ed errori.
  • Filtro file . Supporta l'inclusione e l'esclusione dei file tramite l'espressione regolare. Non è necessario eseguire comandi come find ./ -name "*.html" -exec CMD.
  • Rinominare l'invio con il valore corrispondente tramite il file di valori-chiave .
  • Rinomina tramite numero intero crescente .
  • Rinominazione ricorsiva di file e directory .
  • Supporto della corsa a secco .
  • Output colorato .

Comando:

$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed
1
Wei Shen

POSIX sh utilizza un ciclo while

Lettura dei nomi dal comando find.

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

Lettura di nomi da un file

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist
1
X Tian

Per Windows e Linux , questo Perl script funzionerà; in questo caso:

$ rnm -l 's/^image//' '*.png'

Lo script potrebbe essere eseguito in modo ricorsivo nelle directory e persino anteporre un conteggio a tutti:

$ rnm -r 's/^/$counter./' '/\.png$/'

Anche i caratteri UTF-8 sono trattati correttamente, sia in Windows che in Linux.

1
circulosmeos

Puoi usare questo strumento: rnm ( pagina web )

Per il tuo caso il comando sarebbe:

rnm -rs '/^image//' *.png

Puoi trovare altri esempi/documenti qui .

0
Jahid