Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Portada » Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 5 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mié Abr 08, 2015 6:27 pm
Mensajes: 1

Nota Publicado: Mié Abr 08, 2015 6:44 pm 
Arriba  
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:
file1=`find . -name carpeta`
if [ -d $file1 ]
   then
   rename 's/carpeta/nueva_carpeta/' $file1
fi


Pero no me funciona... :/

Gracias de antemano

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Vie Abr 10, 2015 5:52 pm
Mensajes: 14
Ubicación: España

Nota Publicado: Mié Abr 15, 2015 10:36 pm 
Arriba  
Bueno te cuento :

Código:
#!/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:
#!/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:
xxxxxx@xxxxxx-VirtualBox:~$ script paco
Script iniciado; el fichero es paco


Saludos y suerte cualquier cosa avisa.

 Perfil WWW  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Dom Oct 19, 2014 6:26 pm
Mensajes: 281

Nota Publicado: Jue Abr 16, 2015 2:53 pm 
Arriba  
Tened en cuenta que find devuelve una lista.
Código:
#!/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:
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:
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)

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Vie Abr 10, 2015 5:52 pm
Mensajes: 14
Ubicación: España

Nota Publicado: Jue Abr 16, 2015 4:08 pm 
Arriba  
Código:
#!/bin/sh
 rename carpeta nueva_carpeta $(find . -type d -name carpeta)


Hombre así el script no funciona.

 Perfil WWW  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Dom Oct 19, 2014 6:26 pm
Mensajes: 281

Nota Publicado: Sab Abr 18, 2015 7:34 pm 
Arriba  
CYR escribió:
Código:
#!/bin/sh
 rename carpeta nueva_carpeta $(find . -type d -name carpeta)


Hombre así el script no funciona.


Código:
[$]: ### 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:
find . -depth -print0 -type d -name nombre_carpeta | xargs -0 rename nombre_carpeta nuevo_nombre {}

Un ejemplo:
Código:
[$]: 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)

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 5 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


 Temas relacionados   Autor   Respuestas   Vistas   Último mensaje 
Ayuda Script en Bash

en Programación

kikelin

8

2188

Mar Ago 19, 2014 8:06 pm

blackman Ver último mensaje

AYuda con script en bash

en Programación

isma3l

5

1290

Sab May 19, 2012 11:19 am

niky45 Ver último mensaje

Ayuda con script basico en BASH

en Sistema

nico1080p

2

311

Mar Jul 03, 2018 3:37 am

nico1080p Ver último mensaje

Ayuda con script en bash [Solucionado]

en Programación

ramonovski

5

1220

Jue Feb 16, 2012 7:35 am

ramonovski Ver último mensaje

Ayuda ejercicio Bash ( shell script)

en Programación

tojiji4

0

457

Lun Nov 07, 2016 8:54 am

tojiji4 Ver último mensaje



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC + 1 hora [ DST ]
Traducción al español por Huan Manwë
phpBB SEO