Risposte:
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
Do not add #!/bin/sh? Ho provato entrambi a lavorare con / senza questa affermazione.
#!/bin/bash. Detto questo, bash è normalmente la shell predefinita in molti computer, quindi non troverai molte differenze: D Puoi trovare maggiori informazioni qui
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
ls? cosa rename ...provi?
renamenon è uno strumento Unix standard.
brew install rename
's//'- ho fatto riferimento a man e c'era una semplice sinossi rename [options] expression replacement file...rename from util-linux 2.23.2
.corrisponde a QUALSIASI personaggio, non solo un punto - per un punto letterale, usa \.invece
for f in *.png; do
fnew=`echo $f | sed 's/_h.png/_half.png/'`
mv $f $fnew
done
mv $f $fnewcon echo $fnewcome seconda riga per assicurarsi che l'output sembri sano.
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 .
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
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:
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
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