Rinominare tutti i file nella directory da $ nome_file a $ nome_file?


139

Semplicemente morto.

Come posso rinominare

05_h.png
06_h.png

per

05_half.png
06_half.png

Almeno, penso che sia semplice, ma è difficile per Google per questo genere di cose se non lo sai già.

Grazie....

Risposte:


302

Usa bash, non è necessario chiamare comandi esterni.

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

Non aggiungere #!/bin/sh

Per coloro che hanno bisogno di quel one-liner:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done

7
Un buon uso della sostituzione della stringa integrata di bash piuttosto che sed
dandrews

3
è regex file / _h.png / _half.png?
user2799603,

15
No, il formato è questo: $ {stringa / sottostringa / sostituzione} - "prima occorrenza sostitutiva". Per maggiori informazioni consulta questo cheat sheet (sezione "stringhe"): bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
WindRider

11
Qualche motivo per Do not add #!/bin/sh? Ho provato entrambi a lavorare con / senza questa affermazione.
Ryan,

6
@Ryan @Ishan Jain Indica infatti la shell back-end che deve eseguire lo script. sh e bash sono shell diverse, quindi possono influire sul comportamento e sulla sintassi dello script. Poiché lo script utilizza una sostituzione di stringa integrata bash, è necessario aggiungere l'intestazione #!/bin/bash. Detto questo, bash è normalmente la shell predefinita in molti computer, quindi non troverai molte differenze: D Puoi trovare maggiori informazioni qui
Cristian Ramon-Cortes,

65

Prova il renamecomando:

rename 's/_h.png/_half.png/' *.png

Aggiornare:

esempio di utilizzo:

creare alcuni contenuti

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

soluzione di prova:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png

1
@CarolineAlexiou: ho aggiunto una sessione di test di esempio. Per favore, provalo Probabilmente hai qualche errore di battitura. Qual è l'output di ls? cosa rename ...provi?
Michał Šrajer,

2
Non funziona in bash su Mac, prima guerra mondiale. renamenon è uno strumento Unix standard.
tandrewnichols,

1
@tandrewnichols, prova homebrew - una volta installato, la rinomina diventa disponibile in pochi secondi conbrew install rename
Simbamangu il

4
per quanto mi riguarda la rinomina non ha funzionato 's//'- ho fatto riferimento a man e c'era una semplice sinossi rename [options] expression replacement file...rename from util-linux 2.23.2
:,

2
tieni presente che .corrisponde a QUALSIASI personaggio, non solo un punto - per un punto letterale, usa \.invece
Meisner

11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done

1
Questo è ottimo per fare una corsa a secco in anticipo. In primo luogo ho sostituito mv $f $fnewcon echo $fnewcome seconda riga per assicurarsi che l'output sembri sano.
lobati,

10

Stai cercando una soluzione bash pura? Esistono molti approcci, ma eccone uno.

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

Ciò presume che gli unici file nella directory corrente che finiscono _h.pngsiano quelli che vuoi rinominare.

Molto più specificamente

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

Presumere che questi due esempi siano i tuoi unici. File.

Per il caso generale, la ridenominazione dei file in è stata trattata in precedenza .


6

Utilizzare l' renameutilità scritta in perl. Potrebbe essere che non sia disponibile per impostazione predefinita, tuttavia ...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png

4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done

4

Avevo una domanda simile: nel manuale descrive la ridenominazione come

rename [option] expression replacement file

così puoi usarlo in questo modo

rename _h _half *.png

Nel codice: "_h" è l'espressione che stai cercando. '_half' è il modello con cui si desidera sostituire. '* .png' è la gamma di file che stai cercando per i tuoi possibili file di destinazione.

Spero che questo possa aiutare c:


1

Un altro approccio può essere manualmente utilizzando l'opzione di rinomina batch

Fare clic con il tasto destro sul file -> Comandi file personalizzati -> Rinomina batch e si può sostituire h. con la metà.

Funzionerà con la GUI basata su Linux usando WinSCP ecc


0

Usa l' renameutilità:

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png

0

Una fodera:
for file in *.php ; do mv "$file" "_$file" ; done


0

Sebbene il set di risposte sia completo, devo aggiungerne un altro mancante.

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
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.