[Bash] Problemas con paréntesis y espacios en nombres de fichero [Solucionado]

Iniciado por Gallu, 17 Julio 2011, 16:15 PM

0 Miembros y 1 Visitante están viendo este tema.

Gallu

Hola a todos , estoy creando un script para renombrar ficheros, con nombres de ficheros normales ya funciona , pero cuando tengo nombres de fichero con espacios o paréntesis no va bien , alguna idea?
El script:
Código (bash) [Seleccionar]

#!/bin/bash
#
#description : Renombra los ficheros del directorio actual y los deja en la carpeta de renombrados
#autor = didacso

carpetaNueva="renombrados"
extension="jpg"
AQUI=$( pwd )
RENOMBRADOS="$AQUI"/$carpetaNueva
ELEMENTOS=0

mkdir "$RENOMBRADOS"
for i in $( ls ); do
NOW=$(date +"%m-%d-%y")-$(date +"%N")
echo  "$AQUI/$NOW.$extension" >> "$RENOMBRADOS/estadisticas.txt"
echo "problema con " "$i"
cp "$i" "$AQUI/$NOW.$extension"
mv "$i" "$RENOMBRADOS/$i"
let ELEMENTOS=ELEMENTOS+1
done


gxmessage -center -title "Operación completada" $ELEMENTOS " elementos procesados"

echo $ELEMENTOS " elementos procesados" >> "$RENOMBRADOS/estadisticas.txt"

la salida del comando es la siguiente
Código (bash) [Seleccionar]

cp: no se puede efectuar `stat' sobre «0g3nG3iJN4FaUzY0H4KvcdJZGFY»: No existe el fichero o el directorio
mv: no se puede efectuar `stat' sobre «0g3nG3iJN4FaUzY0H4KvcdJZGFY»: No existe el fichero o el directorio
cp: no se puede efectuar `stat' sobre «(1)»: No existe el fichero o el directorio
mv: no se puede efectuar `stat' sobre «(1)»: No existe el fichero o el directorio
cp: no se puede efectuar `stat' sobre «0g3nG3iJN4FaUzY0H4KvcdJZGFY»: No existe el fichero o el directorio
mv: no se puede efectuar `stat' sobre «0g3nG3iJN4FaUzY0H4KvcdJZGFY»: No existe el fichero o el directorio
cp: no se puede efectuar `stat' sobre «(10).jpg»: No existe el fichero o el directorio
mv: no se puede efectuar `stat' sobre «(10).jpg»: No existe el fichero o el directorio
cp: no se puede efectuar `stat' sobre «0g3nG3iJN4FaUzY0H4KvcdJZGFY»: No existe el fichero o el directorio
mv: no se puede efectuar `stat' sobre «0g3nG3iJN4FaUzY0H4KvcdJZGFY»: No existe el fichero o el directorio
cp: no se puede efectuar `stat' sobre «(2)»: No existe el fichero o el directorio
mv: no se puede efectuar `stat' sobre «(2)»: No existe el fichero o el directorio
cp: no se puede efectuar `stat' sobre «0g3nG3iJN4FaUzY0H4KvcdJZGFY»: No existe el fichero o el directorio
mv: no se puede efectuar `stat' sobre «0g3nG3iJN4FaUzY0H4KvcdJZGFY»: No existe el fichero o el directorio
cp: no se puede efectuar `stat' sobre «(4)»: No existe el fichero o el directorio
mv: no se puede efectuar `stat' sobre «(4)»: No existe el fichero o el directorio
cp: no se puede efectuar `stat' sobre «0g3nG3iJN4FaUzY0H4KvcdJZGFY»: No existe el fichero o el directorio
mv: no se puede efectuar `stat' sobre «0g3nG3iJN4FaUzY0H4KvcdJZGFY»: No existe el fichero o el directorio
cp: no se puede efectuar `stat' sobre «(5).jpg»: No existe el fichero o el directorio
mv: no se puede efectuar `stat' sobre «(5).jpg»: No existe el fichero o el directorio



los nombres de los ficheros son los siguientes:

Código (bash) [Seleccionar]

0g3nG3iJN4FaUzY0H4KvcdJZGFY (1)       0g3nG3iJN4FaUzY0H4KvcdJZGFY (2)  0g3nG3iJN4FaUzY0H4KvcdJZGFY (5).jpg  0g3nG3iJN4FaUzY0H4KvcdJZGFY (9).jpg
0g3nG3iJN4FaUzY0H4KvcdJZGFY (10).jpg  0g3nG3iJN4FaUzY0H4KvcdJZGFY (4)  0g3nG3iJN4FaUzY0H4KvcdJZGFY (8).jpg  

no se si el problema es por el espacio o por el paréntesis
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

leogtz

Prueba a extraer las carpetas y archivos conflictivos desde un archivo de texto, mira:


Código (bash) [Seleccionar]
#!/bin/bash
ls -1 > cosas
while read line
do
echo -e "Problema con : [$line]";
done < cosas
rm -f cosas


Mira, yo tengo estos archivos con espacios:


Código (bash) [Seleccionar]
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─> ls -1 *.jpg
0g3nG3iJN4FaUzY0H4KvcdJZGFY (10).jpg
0g3nG3iJN4FaUzY0H4KvcdJZGFY (8).jpg
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─>


Y corriendo el código:

CitarProblema con : [ 0g3nG3iJN4FaUzY0H4KvcdJZGFY (10).jpg ]
Problema con : [ 0g3nG3iJN4FaUzY0H4KvcdJZGFY (8).jpg ]
Problema con : [ alg.c ]
Problema con : [ args.c ]
Problema con : [ autos.bc ]
Problema con : [ bdpass.kdb ]
Problema con : [ code.c ]
...

El script toma bien los nombres con espacios o paréntesis.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Gallu

Hola Leo , gracias por contestar, tu código funciona bien, pero estaba intentando hacerlo sin necesidad de un fichero , en mi código me había dado cuenta de que los nombres de fichero que contienen espacios los divide en dos , por ejemplo
foto 1.jpg
al hacer el ls i guardar el nombre del fichero en i , si hago un printf de i me pondría
foto
1.jpg
la verdad es que me gustaría arreglarlo para que me lo pille de esa manera, el problema esta en
Código (bash) [Seleccionar]

for i in $( ls -1 ); do


se te ocurre algo ?
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

leogtz

Código (bash) [Seleccionar]
#!/bin/bash
ls -1 | while read archivo
do
echo -e "[$archivo]";
done


[0g3nG3iJN4FaUzY0H4KvcdJZGFY (10).jpg]
[0g3nG3iJN4FaUzY0H4KvcdJZGFY (8).jpg]
[alg.c]
[args.c]
...
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Gallu

Perfecto , me ha funcionado a la perfección, muchas gracias , dejo el script completo por si alguien le sirve, este script debe ubicarse en la ruta de scripts de nautilus para que aparezca el menu contextual y pueda ser llamado dando al botón derecho dentro de cualquier directorio, creará una carpeta llamada renombrados donde dejará los archivos tal y como estaban antes de renombrarlos.
Código (bash) [Seleccionar]
/home/diego/.gnome2/nautilus-scripts

Se puede mejorar ...

renombra.sh
Código (bash) [Seleccionar]

#!/bin/bash
#
#description : Renombra los ficheros del directorio actual y los deja en la carpeta de renombrados
#autor = didacso  for i in $( ls ); do

carpetaNueva="renombrados"
extension="jpg"
AQUI=$( pwd )
RENOMBRADOS="$AQUI"/$carpetaNueva
let ELEMENTOS=0

mkdir "$RENOMBRADOS"
ls -1 | while read i ; do
NOW=$(date +"%m-%d-%y")-$(date +"%N")
echo  "$AQUI/$NOW.$extension" >> "$RENOMBRADOS/estadisticas.txt"
cp "$i" "$AQUI/$NOW.$extension"
mv "$i" "$RENOMBRADOS/$i"
let ELEMENTOS=ELEMENTOS+1
done


gxmessage -center -title "Operación completada" $ELEMENTOS " elementos procesados"

echo $ELEMENTOS " elementos procesados" >> "$RENOMBRADOS/estadisticas.txt"

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.