Tengo un script bash que estoy tratando de reemplazar puntos en los nombres de archivo y reemplazarlos con guiones bajos, dejando la extensión intacta (estoy en Centos 6 por cierto). Como puede ver en el resultado a continuación, el script funciona cuando hay un punto para reemplazar, pero en los casos en que el único punto es la extensión, el script aún intenta cambiar el nombre del archivo, en lugar de ignorarlo. ¿Alguien puede señalar cómo debería manejar esto mejor? Gracias por cualquier ayuda.
Mi script (defectuoso):
#!/bin/bash
for THISFILE in *
do
filename=${THISFILE%\.*}
extension=${THISFILE##*\.}
newname=${filename//./_}
echo "mv $THISFILE ${newname}.${extension}"
#mv $THISFILE ${newname}.${extension}
done
Entrada de muestra:
1.3MN-Pin-Eurotunnel-Stw505.51.024-EGS-130x130.jpg
Wear-Plates.jpg
Salida:
mv 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg
mv Wear-Plates_jpg.Wear-Plates_jpg Wear-Plates_jpg.Wear-Plates_jpg
tar.gz
archivos? Querrías que lo resuelvanfile.tar.gz
, nofile_tar.gz
.Respuestas:
Creo que este programa hará lo que quieras. Lo he probado y funciona en varios casos interesantes (como ninguna extensión):
El problema principal que tenía era que la
##
expansión no estaba haciendo lo que quería. Siempre he considerado que la expansión de parámetros de shell en bash es algo así como un arte negro. Las explicaciones en el manual no son completamente claras y carecen de ejemplos de apoyo de cómo se supone que funciona la expansión. También son bastante crípticos.Personalmente, habría escrito un pequeño guión en el
sed
que manipulaba el nombre de la manera que quería, o hubiera escrito un pequeño guiónperl
que simplemente hiciera todo. Una de las otras personas que respondieron tomó ese enfoque.Otra cosa que me gustaría señalar es mi uso de las citas. Cada vez que hago algo con scripts de shell, les recuerdo a las personas que tengan mucho cuidado con sus citas. Una gran fuente de problemas en los scripts de shell es el intérprete de shell que no debe hacerlo. Y las reglas de las citas están lejos de ser obvias. Creo que este script de shell no tiene problemas de citas.
fuente
Uso
for thisfile in *.*.*
(es decir, recorrer archivos con dos puntos o más en su nombre). Recuerde citar sus variables y usar--
para marcar el final de las opciones como enmv -- "$thisfile" "$newname.$extension"
Con zsh.
fuente
Qué tal esto:
DESCARGO DE RESPONSABILIDAD: pruébelo primero en un directorio ficticio, ¡no lo he probado!
fuente
/
.Parece que algunas buenas respuestas ya están disponibles, pero aquí hay otra que usa
tr
ysed
:fuente
sed
decide a qué.*
aplicar munch máximo? Me siento mucho mejor acerca de si el segundo.*
eran[^_]*
.\t
caracteres.echo -n "$file"
trabajaría. :-) Ah, y"
alrededor de la$( ... )
expresión (aka"$( ... )"
) lo haría.Esta versión le permite seleccionar explícitamente el número de puntos que desea mantener, comenzando desde el lado derecho.
También reemplazará y / o eliminará otros caracteres además de los puntos, y el carácter de reemplazo es en
-
lugar de un guión bajo, pero esto se puede cambiar fácilmente.fuente