Ayuda con script en Bash

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
muse
Forista Nuevo
Forista Nuevo
Mensajes: 1
Registrado: Mié Abr 08, 2015 6:27 pm

Ayuda con script en Bash

Mensaje por muse » Mié Abr 08, 2015 6:44 pm

Buenas,

Soy muy novato en esto de los scripts, además de autodidacta, espero me podais ayudar :)

Estoy intentando crear un script que busque unas determinadas carpetas en un directorio con muchísimos subdirectorios y que las renombre sin moverlas. Decir que dentro del directorio se puede encontrar esa carpeta a renombrar en varios subdirectorios.

Algo así:

Código: Seleccionar todo

file1=`find . -name carpeta`
if [ -d $file1 ]
	then
	rename 's/carpeta/nueva_carpeta/' $file1
fi
Pero no me funciona... :/

Gracias de antemano
CYR
Forista Nuevo
Forista Nuevo
Mensajes: 14
Registrado: Vie Abr 10, 2015 5:52 pm
Ubicación: España
Contactar:

Re: Ayuda con script en Bash

Mensaje por CYR » Mié Abr 15, 2015 10:36 pm

Bueno te cuento :

Código: Seleccionar todo

#!/bin/sh

file1=`find -ls . -name carpeta`
if [ -d $file1 ]; then
   rename 's/carpeta/nueva_carpeta/' $file1
else
   echo "FILE NOT EXIST"
fi
Necesitas escribir :

Código: Seleccionar todo

#!/bin/sh
  1. Para que se considere un script de shell.
  2. Faltaba el ";" despues del [].
  3. Si quieres darle un poco de estile le añadí el else.
  4. -ls para que busque en todos los subdirectorios
Aunque este programa lo que hace es busca , pero si no lo encuentra lo crea.

Código: Seleccionar todo

xxxxxx@xxxxxx-VirtualBox:~$ script paco
Script iniciado; el fichero es paco
Saludos y suerte cualquier cosa avisa.
Avatar de Usuario
cargoan
Forista Medio
Forista Medio
Mensajes: 281
Registrado: Dom Oct 19, 2014 6:26 pm

Re: Ayuda con script en Bash

Mensaje por cargoan » Jue Abr 16, 2015 2:53 pm

Tened en cuenta que find devuelve una lista.

Código: Seleccionar todo

#!/bin/env bash

for carpeta in $(find . -type d -name carpeta); do
    rename carpeta nueva_carpeta $carpeta
done
y que rename actúa sobre una lista de archivos, por lo que basta un único comando:

Código: Seleccionar todo

rename carpeta nueva_carpeta $(find . -type d -name carpeta)
Editado -- Jue Abr 16, 2015 2:52 pm --

También sería aconsejable invertir el orden de la lista por si hubiesen carpetas con el mismo nombre dentro de otra. Si no, al renombrar la carpeta padre luego no puede encontrar las carpetas hijas.

Código: Seleccionar todo

rename carpeta nueva_carpeta $(find . -type d -name carpeta | sort -r)
así renombrará primero las carpetas anidadas.
«La simplicidad es la máxima sofisticación» L. da Vinci
Arch Linux 64 (liquorix+BFS)
CYR
Forista Nuevo
Forista Nuevo
Mensajes: 14
Registrado: Vie Abr 10, 2015 5:52 pm
Ubicación: España
Contactar:

Re: Ayuda con script en Bash

Mensaje por CYR » Jue Abr 16, 2015 4:08 pm

Código: Seleccionar todo

#!/bin/sh
 rename carpeta nueva_carpeta $(find . -type d -name carpeta)
Hombre así el script no funciona.
Avatar de Usuario
cargoan
Forista Medio
Forista Medio
Mensajes: 281
Registrado: Dom Oct 19, 2014 6:26 pm

Re: Ayuda con script en Bash

Mensaje por cargoan » Sab Abr 18, 2015 7:34 pm

CYR escribió:

Código: Seleccionar todo

#!/bin/sh
 rename carpeta nueva_carpeta $(find . -type d -name carpeta)
Hombre así el script no funciona.

Código: Seleccionar todo

[$]: ### el script
[$]: cat find1.sh
#!/bin/sh
rename carpeta nueva_carpeta $(find . -type d -name carpeta 2>/dev/null | sort -r)
[$]: ### las carpetas
[$]: find . -type d -name carpeta 2>/dev/null 
./backup/carpeta
./backup/carpeta2/carpeta
./carpeta
./carpeta/carpeta1/carpeta
[$]: ### ejecutamos el script
[$]: ./find1.sh 
[$]: ### las carpetas
[$]: find . -type d -name *carpeta 2>/dev/null 
./backup/carpeta2/nueva_carpeta
./backup/nueva_carpeta
./nueva_carpeta
./nueva_carpeta/carpeta1/nueva_carpeta
[$]: ### restauramos las carpetas
[$]: rename nueva_carpeta carpeta $(find . -type d -name nueva_carpeta 2>/dev/null | sort -r)
[$]: ### las carpetas
[$]: find . -type d -name *carpeta 2>/dev/null 
./backup/carpeta
./backup/carpeta2/carpeta
./carpeta
./carpeta/carpeta1/carpeta
:geek:

Editado -- Sab Abr 18, 2015 4:55 pm --

Para que maneje cualquier nombre válido, incluídos saltos de línea en el nombre.

Código: Seleccionar todo

find . -depth -print0 -type d -name nombre_carpeta | xargs -0 rename nombre_carpeta nuevo_nombre {} 
Un ejemplo:

Código: Seleccionar todo

[$]: echo  "$(find . -type d -iname '*carpeta*' 2>/dev/null)" 
./otra carpeta
./carpeta 1
./carpeta 1/carpeta
./carpeta
22
./carpeta
22/carpeta
[$]: find . -depth -type d -name "carpeta*" -print0 2>/dev/null | xargs -0 rename carpeta "Copia de carpeta" {} 
[$]: echo  "$(find . -type d -iname '*carpeta*' 2>/dev/null)" 
./Copia de carpeta 1
./Copia de carpeta 1/Copia de carpeta
./otra carpeta
./Copia de carpeta
22
./Copia de carpeta
22/Copia de carpeta
[$]: find . -depth -type d -name "Copia de carpeta*" -print0 2>/dev/null | xargs -0 rename "Copia de carpeta" carpeta {}
[$]: echo  "$(find . -type d -iname '*carpeta*' 2>/dev/null)" 
./otra carpeta
./carpeta 1
./carpeta 1/carpeta
./carpeta
22
./carpeta
22/carpeta
[$]: find . -depth -type d -name $'carpeta\n22' -print0 2>/dev/null | xargs -0 rename $'carpeta\n22' "carpeta 22" {} 
[$]: echo  "$(find . -type d -iname '*carpeta*' 2>/dev/null)" 
./carpeta 22
./carpeta 22/carpeta
./otra carpeta
./carpeta 1
./carpeta 1/carpeta
«La simplicidad es la máxima sofisticación» L. da Vinci
Arch Linux 64 (liquorix+BFS)
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje