2010-01-15 14 views
8

ho una directory con un gruppo di file con nomi come:comando bash per rimuovere gli zeri iniziali da tutti i nomi di file

0.jpg 
0.jpg 
004729342.jpg 

Voglio rimuovere gli zeri iniziali da tutti i nomi dei file, in modo da sarei lasciato con:

1234.jpg 
1235.jpg 
4729342.jpg 

Ho provato diverse configurazioni di sed, ma non riesco a trovare la sintassi corretta. C'è un modo semplice per elencare tutti i file nella directory, collegarli tramite sed e spostarli o copiarli nel nuovo nome del file senza gli zeri iniziali?

+0

Nota: questo renderà l'ordinamento più difficile. –

+1

Con coreutils GNU, 'ls -v' ordinerà i numeri in modo naturale (usando le estensioni di Glibc' versionsort (3)/strverscmp (3) '). Ma sì, in generale, cambiare le porzioni numeriche dei nomi dei file per non più allineare per lunghezza cambia il normale ordine di confronto. – ephemient

risposta

7
for FILE in `ls`; do mv $FILE `echo $FILE | sed -e 's:^0*::'`; done 
+1

Non è necessario (e non dovrebbe) usare 'ls' come questo. In questo modo: 'per FILE in *' –

+1

questo è un cattivo esempio. prima si usa ls, quindi non si citano mai le variabili – ghostdog74

+0

Non vedo alcun problema con l'utilizzo di ls. Puoi sostituirlo con il comando find suggerito qui sotto o con qualsiasi altro comando. Dal momento che funziona, non vedo davvero quali sono le tue giustificazioni oltre a quelle stilistiche, che quando si tratta di script di shell su una riga sembra un po 'inutile. – cyborg

1

Provare a utilizzare sed, ad es .:

sed -e 's:^0*::' 

ciclo completo:

for f in `ls`; do 
    mv $f $(echo $f | sed -e 's:^0*::') 
done 
+0

Come posso passare il contenuto della directory in questo comando? – George

+0

aggiornato il post – eduffy

+0

Questo è probabilmente abbastanza buono per la situazione di George, ma in un ambiente diverso si potrebbe desiderare di gestire il caso speciale in cui il nome del file è tutti zero. –

0

Forse non è il più elegante ma funzionerà.

for i in 0* 
do 
mv "${i}" "`expr "${i}" : '0*\(.*\)'`" 
done 
+0

La tua formattazione deve funzionare. Usa 4 spazi prima di "per" per rendere l'intera linea una sezione codificata. – bradlis7

0

Non so sed a tutti, ma è possibile ottenere un elenco utilizzando find:

find -type f -name *.jpg

così con l'altra risposta potrebbe apparire come

find . -type f -name *.jpg | sed -e 's:^0*::'

ma non so se quel comando sed regge o no.

7

sed di per sé è lo strumento sbagliato per questo: è necessario utilizzare un po 'di shell scripting pure.

Verificare la pagina Rename multiple files with Linux per alcune idee. Una delle idee suggerite è quella di utilizzare lo script perl rename:

rename 's/^0*//' *.jpg 
+0

Mi piace quel comando, ma sfortunatamente non è installato su tutti i sistemi :(. –

+0

"sed di per sé è lo strumento sbagliato per questo"? Http://xkcd.com/285/ – BryanH

+0

@BryanH: ?? Questa non è Wikipedia quindi non sono sicuro del motivo per il tuo cartone animato xkcd. Il punto che penso stavo cercando di fare (credo - questo era circa 18 mesi fa) era che sed di per sé non è in grado di rinominare i file - avresti bisogno –

0

Ecco uno che non richiede sed:

for x in *.jpg ; do let num="10#${x%%.jpg}"; mv $x ${num}.jpg ; done 

Si noti che questo funziona solo quando i nomi dei file sono tutti i numeri. Si potrebbe anche rimuovere gli zeri iniziali utilizzando la shell:

for a in *.jpg ; do dest=${a/*(0)/} ; mv $a $dest ; done 
6

In Bash, che rischia di essere la vostra shell di login di default, non comandi esterni sono necessari.

shopt -s extglob 
for i in 0*[^0]; do mv "$i" "${i##*(0)}"; done 
+0

questa dovrebbe essere la risposta accettata – zero0cool

0

In shell Bash si può fare:

shopt -s nullglob 
for file in 0*.jpg 
do 
    echo mv "$file" "${file##*0}" 
done 
Problemi correlati