2010-01-15 16 views
8

que tengo un directorio con un montón de archivos con nombres como:de comandos Bash para eliminar los ceros iniciales de los nombres de archivos

0.jpg 
0.jpg 
004729342.jpg 

Quiero eliminar los ceros iniciales de los nombres de archivos, por lo que sería izquierda con:

1234.jpg 
1235.jpg 
4729342.jpg 

He estado probando diferentes configuraciones de sed, pero no encuentro la sintaxis adecuada. ¿Existe una manera fácil de listar todos los archivos en el directorio, canalizarlos a través de sed y moverlos o copiarlos al nuevo nombre de archivo sin los ceros a la izquierda?

+0

Nota: esto hará más difícil la clasificación. –

+1

Con GNU coreutils, 'ls -v' ordenará los números de forma natural (usando las extensiones Glibc' versionsort (3)/strverscmp (3) '). Pero sí, en general, cambiar las partes numéricas de los nombres de archivo para que no se alineen por longitud cambia el orden normal de colación. – ephemient

Respuesta

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

No necesita (y no debe) utilizar 'ls' como este. Hazlo de esta manera: 'para FILE en *' –

+1

este es un mal ejemplo. primero usando ls, y luego nunca cite sus variables – ghostdog74

+0

No veo ningún problema con el uso de ls. Puede sustituirlo por el comando de búsqueda que se sugiere a continuación o cualquier otro comando. Como funciona, realmente no veo cuáles son tus justificaciones más que estilísticas, que cuando se trata de guiones de shell de una línea parece un poco sin sentido. – cyborg

1

Intente utilizar sed, por ejemplo .:

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

bucle completo:

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

¿Cómo paso el contenido del directorio a este comando? – George

+0

actualizó la publicación – eduffy

+0

Esto es probablemente lo suficientemente bueno para la situación de George, pero en un entorno diferente, uno podría desear manejar el caso especial donde el nombre de archivo es todo ceros. –

0

Quizás no es el más elegante pero funcionará.

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

Su formato necesita trabajo. Utilice 4 espacios antes de 'para' para hacer que toda la línea sea una sección codificada. – bradlis7

0

No sé SED en absoluto, pero se puede obtener una lista mediante el uso de find:

find -type f -name *.jpg

lo mismo con la otra respuesta puede ser que parezca

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

pero no sé si ese comando sed se mantiene o no.

7

sed por sí mismo es la herramienta equivocada para esto: es necesario utilizar algunas secuencias de comandos shell también.

Compruebe Rename multiple files with Linux página para algunas ideas. Una de las ideas sugeridas es utilizar el script de perl rename:

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

Me encanta ese comando, pero desafortunadamente no está instalado en todos los sistemas :(. –

+0

"sed por sí mismo es la herramienta incorrecta para esto"? Http://xkcd.com/285/ – BryanH

+0

@BryanH: ?? Esto no es Wikipedia , así que no estoy seguro de la razón de su caricatura xkcd. El punto que creo que estaba tratando de hacer (supongo que esto fue hace unos 18 meses) fue que sed no puede cambiar el nombre de los archivos, necesitaría algunas secuencias de comandos adicionales para ir con él. –

0

Aquí hay uno que no requiere sed:

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

Tenga en cuenta que esto sólo funciona cuando los nombres de archivo son todos los números. También se pudo eliminar los ceros iniciales utilizando el shell:

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

En Bash, que es probable que sea su shell de inicio por defecto, no hay comandos externos son necesarios.

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

esta debería ser la respuesta aceptada – zero0cool

0

En Bash que puede hacer:

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