Hola a todos, Tengo un problema que me ha llevado toda la tarde y no consigo verlo. Es probable que sea una g...llez y que no lo vea por el cansancio. Antes de apagar el ordenador os lo dejo en la lista por si a alguien se le enciende la luz. Tengo un directorio con ficheros provenientes de windows que tienen espacios en el nombre. Mi intención es cambiar cada espacio por un guión bajo. Por ejemplo, Fichero 1.txt cambiarlo a Fichero_1.txt. Tengo del orden de 200 ficheros que responden al patron Fichero n.txt. He investigado un poco por ahí y he decidido quedarme con tr. Diseñé el script: ----------------------------- #!bin/bash SOURCE_DIR="/home/zutanito/Desktop/prueba" clear mkdir $SOURCE_DIR cd $SOURCE_DIR for i in *txt ; do j=`echo $i | tr ' ' '_'` ; echo $i; echo $j; cp $i $j ; done ----------------------------- La salida de la consola es: ----------------------------- list corp dir 1.txt list_corp_dir_1.txt cp: target «list_corp_dir_1.txt» is not a directory ----------------------------- como se puede ver, las variables $i y $j son interpretadas perfectamente, pero en el cp $i $j; falla todo. No entiendo porqué en la consola puedo hacer manualmente cp list\ corp\ dir\ 1.txt list_corp_dir_1.txt y funciona perfectamente mientras que en el script no es posible. En la desesperación intenté en la consola find /home/zutanito/prueba/ -name "*txt" -exec echo {} | tr ' ' '_' {} \ ; pero ni en broma ya que supongo habrá algo más de sintaxis en la línea. Gracias a todos y un abrazo, E Garrido
El 29/03/06, Comventia Express
Hola a todos,
Tengo un problema que me ha llevado toda la tarde y no consigo verlo. Es probable que sea una g...llez y que no lo vea por el cansancio. Antes de apagar el ordenador os lo dejo en la lista por si a alguien se le enciende la luz.
[...]
La salida de la consola es:
----------------------------- list corp dir 1.txt list_corp_dir_1.txt cp: target «list_corp_dir_1.txt» is not a directory -----------------------------
como se puede ver, las variables $i y $j son interpretadas perfectamente, pero en el cp $i $j; falla todo.
No entiendo porqué en la consola puedo hacer manualmente cp list\ corp\ dir\ 1.txt list_corp_dir_1.txt y funciona perfectamente mientras que en el script no es posible.
posiblemente por el motivo que debas de colocar vuestras variables que estan en script entre "comillas dobles" !!!! del contrario ira pasar los seguintes argumentos para el comando cp: cp list corp dir 1.txt list_corp_dir_1.txt o sea.. intentaras copiar los archivos "list", "corp", "dir", "1.txt" para la carpeta "list_corp_dir_1.txt" que en este caso no existe !!!! por cierto, es super bueno linux por motivo que te permite crear vuestros proprios scripts y automatizar los procesos, pero caso necesites de un ejemplo, de una mirada en este enlace: http://comp.eonworks.com/scripts/subspace
En la desesperación intenté en la consola
find /home/zutanito/prueba/ -name "*txt" -exec echo {} | tr ' ' '_' {} \ ;
pero ni en broma ya que supongo habrá algo más de sintaxis en la línea.
Por cierto, supongo que hiciste respaldos de los archivos antes de ponerte a jugar con ellos, cierto ??? salu2. -- -- Victor Hugo dos Santos Linux Counter #224399
Hola. El Miércoles, 29 de Marzo de 2006 19:42, Comventia Express escribió:
Hola a todos,
Tengo un problema que me ha llevado toda la tarde y no consigo verlo. Es probable que sea una g...llez y que no lo vea por el cansancio. Antes de apagar el ordenador os lo dejo en la lista por si a alguien se le enciende la luz.
Tengo un directorio con ficheros provenientes de windows que tienen espacios en el nombre. Mi intención es cambiar cada espacio por un guión bajo. Por ejemplo, Fichero 1.txt cambiarlo a Fichero_1.txt. Tengo del orden de 200 ficheros que responden al patron Fichero n.txt.
Si usas kde, prueba el krename, es la solucion, hacer eso es cosa de 5 sg con krename
He investigado un poco por ahí y he decidido quedarme con tr. Diseñé el script:
----------------------------- #!bin/bash
SOURCE_DIR="/home/zutanito/Desktop/prueba" clear mkdir $SOURCE_DIR cd $SOURCE_DIR
for i in *txt ; do j=`echo $i | tr ' ' '_'` ; echo $i; echo $j; cp $i $j ; done -----------------------------
La salida de la consola es:
----------------------------- list corp dir 1.txt list_corp_dir_1.txt cp: target «list_corp_dir_1.txt» is not a directory -----------------------------
como se puede ver, las variables $i y $j son interpretadas perfectamente, pero en el cp $i $j; falla todo.
No entiendo porqué en la consola puedo hacer manualmente cp list\ corp\ dir\ 1.txt list_corp_dir_1.txt y funciona perfectamente mientras que en el script no es posible.
En la desesperación intenté en la consola
find /home/zutanito/prueba/ -name "*txt" -exec echo {} | tr ' ' '_' {} \ ;
pero ni en broma ya que supongo habrá algo más de sintaxis en la línea.
Gracias a todos y un abrazo, E Garrido
-- Un Saludo. Carlos Lorenzo Matés
El Miércoles, 29 de Marzo de 2006 19:42, Comventia Express escribió:
Hola a todos,
Tengo un problema que me ha llevado toda la tarde y no consigo verlo. Es probable que sea una g...llez y que no lo vea por el cansancio. Antes de apagar el ordenador os lo dejo en la lista por si a alguien se le enciende la luz.
Tengo un directorio con ficheros provenientes de windows que tienen espacios en el nombre. Mi intención es cambiar cada espacio por un guión bajo. Por ejemplo, Fichero 1.txt cambiarlo a Fichero_1.txt. Tengo del orden de 200 ficheros que responden al patron Fichero n.txt.
============ inicio script ================== #!/bin/sh DO= if [ "_$1" = "_-n" ] then DO=echo shift fi find $1 -depth -print |\ while read file do DIR=`expr "$file" : '\(\([^\/]*\/\)*\)\(.*\)'` FILE=`expr "$file" : "$DIR"'\(.*\)'` NFILE="$DIR"`echo "$FILE" | tr '[A-Z]' '[a-z]' | tr '][|!;:\ #$&~' _ ` if [ "$NFILE" != "$file" ] then if [ -f "$NFILE" ] then echo Warning: "$NFILE" exists "($file)" else echo Renaming: "$NFILE" $DO mv "$file" "$NFILE" fi fi done ================ Fin ================== * Krename es una opcion en modo grafico bastante potente, entre otras cosas por que antes de ejecutar la orden vas viendo "como seria el resultado"
Muchas gracias por vuestras respuestas. La solución de Carlos Lorenzo está
muy bien y la de Victor Hugo, funciona también estupendamente. Cualquiera de
ellas me ha valido. Pero, después de una tarde completa trabajando con los
ficheros, voy a estudiar detenidamente el script de Victor para entenderlo y
ver cómo el autor del mismo lo solucionó.
Muchas gracias, de nuevo, a ambos.
Un abrazo,
E Garrido
El día 29/03/06, Comventia Express
Hola a todos,
Tengo un problema que me ha llevado toda la tarde y no consigo verlo. Es probable que sea una g...llez y que no lo vea por el cansancio. Antes de apagar el ordenador os lo dejo en la lista por si a alguien se le enciende la luz.
Tengo un directorio con ficheros provenientes de windows que tienen espacios en el nombre. Mi intención es cambiar cada espacio por un guión bajo. Por ejemplo, Fichero 1.txt cambiarlo a Fichero_1.txt. Tengo del orden de 200 ficheros que responden al patron Fichero n.txt.
He investigado un poco por ahí y he decidido quedarme con tr. Diseñé el script:
----------------------------- #!bin/bash
SOURCE_DIR="/home/zutanito/Desktop/prueba" clear mkdir $SOURCE_DIR cd $SOURCE_DIR
for i in *txt ; do j=`echo $i | tr ' ' '_'` ; echo $i; echo $j; cp $i $j ; done -----------------------------
La salida de la consola es:
----------------------------- list corp dir 1.txt list_corp_dir_1.txt cp: target «list_corp_dir_1.txt» is not a directory -----------------------------
como se puede ver, las variables $i y $j son interpretadas perfectamente, pero en el cp $i $j; falla todo.
No entiendo porqué en la consola puedo hacer manualmente cp list\ corp\ dir\ 1.txt list_corp_dir_1.txt y funciona perfectamente mientras que en el script no es posible.
En la desesperación intenté en la consola
find /home/zutanito/prueba/ -name "*txt" -exec echo {} | tr ' ' '_' {} \ ;
pero ni en broma ya que supongo habrá algo más de sintaxis en la línea.
Gracias a todos y un abrazo, E Garrido
El Miércoles, 29 de Marzo de 2006 1:42 PM, Comventia Express escribió:
Hola a todos,
Tengo un problema que me ha llevado toda la tarde y no consigo verlo. Es probable que sea una g...llez y que no lo vea por el cansancio. Antes de apagar el ordenador os lo dejo en la lista por si a alguien se le enciende la luz.
Tengo un directorio con ficheros provenientes de windows que tienen espacios en el nombre. Mi intención es cambiar cada espacio por un guión bajo. Por ejemplo, Fichero 1.txt cambiarlo a Fichero_1.txt. Tengo del orden de 200 ficheros que responden al patron Fichero n.txt.
He investigado un poco por ahí y he decidido quedarme con tr. Diseñé el script:
----------------------------- #!bin/bash
SOURCE_DIR="/home/zutanito/Desktop/prueba" clear mkdir $SOURCE_DIR cd $SOURCE_DIR
for i in *txt ; do j=`echo $i | tr ' ' '_'` ; echo $i; echo $j; cp $i $j ; done -----------------------------
La salida de la consola es:
----------------------------- list corp dir 1.txt list_corp_dir_1.txt cp: target «list_corp_dir_1.txt» is not a directory -----------------------------
como se puede ver, las variables $i y $j son interpretadas perfectamente, pero en el cp $i $j; falla todo.
No entiendo porqué en la consola puedo hacer manualmente cp list\ corp\ dir\ 1.txt list_corp_dir_1.txt y funciona perfectamente mientras que en el script no es posible.
En la desesperación intenté en la consola
find /home/zutanito/prueba/ -name "*txt" -exec echo {} | tr ' ' '_' {} \ ;
pero ni en broma ya que supongo habrá algo más de sintaxis en la línea.
Prueba con este artículo de cambio de nombres de archivos con bash. http://www.softwarelibre.com.ve/index.php/usuario/articulos/cambiando_nombre... Sustituye las listas de caracteres con el espacio en blanco y el guión. -- ************************ Hugo Sandoval Consultor http://www.softwarelibre.com.ve http://www.virtualnet.com.ve ************************ <*******> HACKER Persona que disfruta del reto intelectual de superar o rodear las limitaciones de forma creativa... El resto es simple delincuencia. <*******>
participants (5)
-
Carlos Lorenzo Matés
-
Comventia Express
-
Hugo Sandoval
-
jose maria
-
Victor Hugo dos Santos