Linux en Espanol
 
Script renombrador (tema #24743)
Publicar nuevo tema  Responder al tema    Foros de discusión -> Programación
Autor Mensaje
cazademonios
Forista
Registrado: 2012-03-23
Mensajes: 68

Publicado: 2013-07-09 09:04:27    Asunto: Script renombrador

Buenas me gustaria crear un script bash/sh
que renombre masivamente los ficheros

por que tengo una carpeta llena de ficheros unos 3gigas
y resulta que los ficheros y carpetas por alg?n motivo los que tienen ? o tildes etc salen con este formato en su nombre de archivo

por ejemplo:
diccionario de oxford de ingl�s (codificaci?n no v?lida)

Y cuando quiero pasar la carpeta al pendrive se copia todo menos los dichos ficheros sera por que ext4 si acepta ese nombre y fat32 no.

Por eso necesito quitarles el signo � y (codificacion no valida) con un script por que a mano me llevar?a un tiempo descomunal

Hab?a pensado en algo como:
[code:1:be183a4ffd]
#!/bin/bash
for i in `ls ./ | grep -e ")"`;
do

done
[/code:1:be183a4ffd]
usando el bucle for pero no se como lo har?a para renombrarlos y hacerlo de manera recursiva

?Alguien tiene alguna idea?
gracias de antemano un saludo 8)
lobo115
Forista
Registrado: 2012-11-07
Mensajes: 12

Publicado: 2013-07-09 14:13:05    Asunto:

Hola, que tal si utilizas sed, no he podido probarlo todavia por que no estoy en mi casa, pero seria algo as? dentro del for:
[code:1:5057933ec0]j=`echo $i | sed 'comando'`
mv $i $j[/code:1:5057933ec0]

ya hab?a visto esto en otro foro, claro que era para otra funci?n pero igual deber?a trabajan, y puedes usar el que consulte por ac?: para los comandos del sed, para ver si trabaja:
http://www.linuxespanol.com/viewtopic.php?t=24551&highlight=
y usas el hola.sed que es donde estan los comandos, si te funciona me puedes avisar?,
Hasta Luego
creo que quedar?a algo como:

[code:1:5057933ec0]#!/bin/bash
for i in `ls ./ | grep -e ")"`;
do
j=`echo $i | sed -f hola.sed`
mv $i $j
done [/code:1:5057933ec0]

hola.sed en la direcci?n donde se encuentra
si no quiz?s reemplazando
[code:1:5057933ec0]j=`echo $i | sed -i -f hola.sed`
[/code:1:5057933ec0]
cazademonios
Forista
Registrado: 2012-03-23
Mensajes: 68

Publicado: 2013-07-09 18:43:03    Asunto:

Pues gracias por la respuesta pero no funcion? me da este error

[code:1:a802a1788c]sed: no se puede abrir el archivo hola.sed: No existe el archivo o el directorio
mv: falta el operando archivo de destino despu?s de ?fichero3)?
Pruebe ?mv --help? para m?s informaci?n[/code:1:a802a1788c]

tambi?n probe con esto pero no funcion?

[code:1:a802a1788c]
#!/bin/bash
for i in `ls ./ | grep -e ")"`;
do
mv $i fichero$(seq 1 9)
done
[/code:1:a802a1788c]
para que me crease fichero1 fichero2 sin el ) pero no funcion?

eso si si lo haces sin $(seq 1 9) si funciona pero solo se queda una carpeta y como que no jeje
lobo115
Forista
Registrado: 2012-11-07
Mensajes: 12

Publicado: 2013-07-09 18:53:04    Asunto:

Hola, bajaste el hola.sed de mi otro post?
debes colocar la ruta de el o donde vas a trabajar, por ejemplo si el est? en /home/yo/hola.sed pones:
[code:1:9da84f51df]j=`echo $i | sed -f /home/yo/hola.sed`[/code:1:9da84f51df]
igual el link donde esta es:
https://docs.google.com/folder/d/0B-hYwuwjVZweanV0aEhkcWJoclE/edit
Hasta luego, cualquier cosa me dices
cazademonios
Forista
Registrado: 2012-03-23
Mensajes: 68

Publicado: 2013-07-09 19:14:10    Asunto:

Perdona es que no entiendo muy bien lo que quer?as hacer con tu hola.sed y tu prueba.txt

ahora he cambiado lo de hola.sed por la ruta donde estan las carpetas de prueba que quiero cambiarles el nombre y me sale esto:

[code:1:d3e58ad304]mv: no se puede mover ?carpeta)? a un directorio de s? mismo, ?carpeta)/carpeta)?
mv: no se puede mover ?carpeta2)? a un directorio de s? mismo, ?carpeta2)/carpeta2)?
mv: no se puede mover ?carpeta3)? a un directorio de s? mismo, ?carpeta3)/carpeta3)?[/code:1:d3e58ad304]
lobo115
Forista
Registrado: 2012-11-07
Mensajes: 12

Publicado: 2013-07-09 19:39:06    Asunto:

Buenas, lo que sucede es que el archivo hola.sed es un archivo de texto con los comandos para reemplazar ? por a ? por e, fue uno que yo use una vez, simplemente queda un archivo de texto con lo siguiente
[code:1:646ea29b61]{
s/?/a/g
s/?/e/g
s/?/i/g
s/?/o/g
s/?/u/g
s/?/-n-/g
s/?/-?/g
s/?/-!/g
s/?/-u/g
s/?/A/g
s/?/E/g
s/?/I/g
s/?/O/g
s//U/g
}[/code:1:646ea29b61]

y lo llamas hola.sed, me avisas cualquier cosa
cazademonios
Forista
Registrado: 2012-03-23
Mensajes: 68

Publicado: 2013-07-09 20:13:53    Asunto:

Perdona pero ahora si que me he perdido de verdad no se lo que quieres hacer con el hola.sed la verdad y si quisieras algo deber?as ponerlo en un nuevo post y lo intentar?a solucionar
pero me estoy quedando confuso :?:
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2013-07-09 22:50:37    Asunto:

Hola.

Por el ejemplo que has puesto del diccionario y los mensajes que das, uno de los problemas lo tienes con los espacios en blanco en los nombres.
Si haces [code:1:fc7a7288d4]for i in `ls ......., [/code:1:fc7a7288d4] y luego [code:1:fc7a7288d4]mv %i ...[/code:1:fc7a7288d4], ser?a una buena idea poner el %i entre comillas dobles [code:1:fc7a7288d4]mv "%i" ...[/code:1:fc7a7288d4]

Saludos.
cazademonios
Forista
Registrado: 2012-03-23
Mensajes: 68

Publicado: 2013-07-09 23:08:46    Asunto:

Cierto lo de las comillas :)

Aunque en mis pruebas uso ficheros sin espacios.
creo que este script que planteo ya necesita de C etc xD
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2013-07-10 01:34:31    Asunto:

Hola.

Mira si puedes aprovechar esto:
[code:1:078c497b00]#!/bin/bash
IFS='
'
for i in `ls ./ | grep -e "("`;
do
salida=$(echo "$i" | awk --field-separator='(' '{print $1}' | tr -c [:alnum:].\-_~ '@' | sed 's/@//g')
echo mv "$i" "/ruta/de/destino/.../.../$salida"
done[/code:1:078c497b00]
El IFS= ..... es para que awk no se haga un l?o con los espacios como separadores de registro. F?jate que detr?s de IFS=' debe haber un retorno de carro, sin espacios. Eso define el retorno de carro como separador de registros.

El awk se queda del nombre del fichero s?lo con lo que vaya delante del primer "(", es decir le quita lo de codificaci?n no v?lida.

El tr cambia todos los caracteres que no sean alfanum?ricos, punto, gui?n, subgui?n o rayita tipo e?e por algo que no esperemos en un nombre como es la arroba. Puedes a?adir m?s caracteres permitidos si te hace falta. Lo de cambiarlo por arroba se debe a que no he sido capaz (tal vez se pueda pero yo no s?) de forzar a "tr" a cambiar caracteres por "nada".

Por ?ltimo sed elimina las arrobas.

Con eso tenemos el nuevo nombre; s?lo falta el mv y se acab?.

Sin C :wink: :wink: :wink: :wink:

Saludos.
lobo115
Forista
Registrado: 2012-11-07
Mensajes: 12

Publicado: 2013-07-10 02:12:07    Asunto:

Buenas hola ya pude probar uno pero solo sirve en los ficheros externos en cuanto pueda te digo de los otros, para eso vamos a crear un archivo hola.sed con lo siguiente dentro de el:
[code:1:a9d0d4b4e0]{
s/?/a/g
s/?/e/g
s/?/i/g
s/?/o/g
s/?/u/g
s/?/-n-/g
s/?/-?/g
s/?/-!/g
s/?/-u/g
s/?/A/g
s/?/E/g
s/?/I/g
s/?/O/g
s//U/g
}[/code:1:a9d0d4b4e0]
este es un archivo normal, lo puedes hacer con kate, kwritte, vi, nano, etc.
el cual vamos a guardarlo en, por ejemplo, /usr/local/scripts
luego creamos otro archivo llamado script con lo siguiente:
[code:1:a9d0d4b4e0]for i in *; do
j=`echo "$i" | sed -f hola.sed`
mv "$i" "$j"
done
[/code:1:a9d0d4b4e0]
y lo guardamos en /usr/local/scripts, ahora le cambiamos los permisos a ambos para darle la opci?n de ejecuci?n, voy a darsela a todos los usuarios esta vez.
[code:1:a9d0d4b4e0]chmod 777 /usr/local/scripts/script
chmod 777 /usr/local/scripts/hola.sed[/code:1:a9d0d4b4e0]
cierto, luego accedemos al directorio donde vamos a renombrar, por ejemplo si est?n en la carpeta ficheros en mi carpeta [code:1:a9d0d4b4e0]cd /home/yo/ficheros[/code:1:a9d0d4b4e0]
y desde ahi escribimos: [code:1:a9d0d4b4e0]/usr/local/scripts/script[/code:1:a9d0d4b4e0]
y ya debimos renombrar todos los ficheros no internos de esa carpeta. :D

perdon no hab?a visto la respuesta de miguelgf :oops: :oops:
lobo115
Forista
Registrado: 2012-11-07
Mensajes: 12

Publicado: 2013-07-10 03:34:03    Asunto:

Buenas modifique algo pero igual hay que ejecutarlo una vez por nivel de las carpetas, seria:
[code:1:cc9ff56413]#!/bin/bash
for i in $(find *); do
j=`echo "$i" | sed -f hola.sed`
mv "$i" "$j"
done[/code:1:cc9ff56413]
hasta luego





La marca registrada Linux (R) se usa siguiendo la sublicensia obtenida del "Linux Mark Institute",
el LICENCIATARIO exclusivo de Linus Torvalds, propietario de la marca en EEUU y otros países
The registered trademark Linux (R) is used pursuant to a sublicense from the Linux Mark Institute,
the exclusive LICENSEE of Linus Torvalds, owner of the mark in the U.S. and other countries