Linux/Unix Shell Scripting - Cambiar arbol de directorios

 
Vista:
sin imagen de perfil

Cambiar arbol de directorios

Publicado por Fernando (8 intervenciones) el 05/05/2014 18:41:31
Hola buenas, tengo una estructura de 8 directorios anidados y quiero pasar a una de 4 a ver si lo consigo explicar

es algo así, en la raiz hay una serie de directorios, todos con un nombre de 2 caracteres alfanumericos
cada uno de estos directorios, contiene otro mas anidado, y este otro, hasta llegar a 8, en este ultimo, se encuentra otro directorio, que es el que quiero copiar 4 directorios mas abajo y eliminar el resto

Esto es lo que tengo:

- Raíz
--w3
---45
----6t
-----td
------po
-------rt
-------3x
--------te
--------adjegsuc-123456-12-321
--jc
---45
----6t
-----td
------po
-------rt
-------3x
--------te
--------adjegsuc-123456-12-321
--00
..

Esto es lo que necesito


- Raíz
--w3
---45
----6t
-----td
------adjegsuc-123456-12-321
--jc
---45
----6t
-----td
------adjegsuc-123456-12-321
--00
..

Os enseño el código que tengo hecho, funciona, la copia, pero no creo que sea los mas optimo, seguro que se puede hacer mejor, a ver que opináis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<code>
#!/bin/bash
 
for folder in */
do
        cd $folder
        for folder in */
        do
                cd $folder
                for folder in */
                do
                        cd $folder
                        for folder in */
                        do
                                cd $folder
                                for folder in */
                                do
                                        cd $folder
                                        for folder in */
                                        do
                                                cd $folder
                                                for folder in */
                                                do
                                                        cd $folder
                                                        for folder in */
														do
                                                                cd $folder
                                                                cp -Rf * ../../../../
                                                                pwd
                                                        done
                                                done
                                        done
                                done
                        done
                done
        done
        cd /test
done
 
</code>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Cambiar arbol de directorios

Publicado por Tom (361 intervenciones) el 06/05/2014 08:47:20
Algo así como:

1
2
3
4
5
cd /
for F in ??/
do
  mv $F/*/*/*/*/*/*/ $F/*/*/*/
done
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Cambiar arbol de directorios

Publicado por Fernando (8 intervenciones) el 06/05/2014 14:49:51
Si, muchas gracias, es lo primero que pensé hacer, pero no se por que no funcionó, pero ahora si que funciona, ahora estoy haciendo un log, para comprobar si todo va bien

Muchas gracias por la ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Cambiar arbol de directorios

Publicado por Fernando (8 intervenciones) el 06/05/2014 15:39:41
Así me a quedado, muchas gracias por la ayuda

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
 
log="/var/log/copiaRecursiva"
if [ -f "$log" ]
then
        echo "El log ya esta creado" >> /var/log/copiaRecursiva
else
        touch $log
fi
 
#cd /
for F in ??/
do
	if [ -d $F/*/*/*/*/*/*/*/* ]
	then
		mv $F/*/*/*/*/*/*/*/* $F/*/*/*/
		if [$? -eq 1]
		then
			rm -rf $F/*/*/*/??
		else
			echo "Error al copiar el directorio " $F >> /var/log/copiaRecursiva
		fi
	else
		echo "El directorio " $F " esta vacio" >> /var/log/copiaRecursiva
	fi
 
done
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Cambiar arbol de directorios

Publicado por Fernando (8 intervenciones) el 06/05/2014 17:23:33
A ver, de la forma que lo tengo funciona, pero no es optimo, por que solo el output de un ls -l ya ocupa 700mb

me han dicho que con un find y sed lo puedo simplificar muchísimo, pero no me aclaro con el sed, de momento consigo la ruta completa de los directorios que quiero mover, y ahora con sed tengo que suprimir los cuatro subdirectorios que no me sirven

find . -type d -mindepth 9 esto me devuelve las rutas de todos los directorios que me sirven
/00/01/02/03/04/05/06/07/2h1kj-123kjhkj32413kjh123
/00/01/02/03/04/05/06/07/2h1kj-123kjhkj32413kjh123
/00/01/02/03/04/05/06/07/2h1kj-123kjhkj32413kjh123
/00/01/02/03/04/05/06/07/2h1kj-123kjhkj32413kjh123
....
son muchisimos todos distintos

ahora si le paso un exec
find . -type d -mindepth 9 -exec sed ''

tendria que recortarme la ruta, pero no se que pasarle al sed
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Cambiar arbol de directorios

Publicado por Tom (361 intervenciones) el 07/05/2014 08:39:46
Yo, personalmente, no entiendo ni el problema de lo que ya te funcionaba, ni lo que quieres hacer con sed ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Cambiar arbol de directorios

Publicado por Fernando (8 intervenciones) el 07/05/2014 14:36:00
El problema que me han puesto con el primer codigo es que me han dicho que no es optimo y que con find y un sed, puedo hacer lo mismo en una sola linea, pero no veo como puedo hacerlo... por que al final se me complica mucho mas el codigo.

el tema es que este escript se va a ejecutar en un arbol de 100Gb de directorios, entonces hay que simplificarlo al maximo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Cambiar arbol de directorios

Publicado por Tom (361 intervenciones) el 07/05/2014 15:00:02
Pero vamos a ver ... ni con find ni con sed (ni con los dos juntos) puedes mover ficheros de un sitio a otro ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Cambiar arbol de directorios

Publicado por Fernando (8 intervenciones) el 07/05/2014 15:03:22
algo como esto, pero de momento, solo lo e conseguido con un destino fijo, me falta como decir en el sed que sea 4 directorios mas abajo

find . type -d mindepth 9 | sed -e "p;s/test/spec/" | xargs -n2 mv

Por cierto, ¿como puedo poner la etiqueta código?

Y perdón si soy un poco pesado, es que me estoy rompiendo mucho la cabeza con esto jeje muchas gracias :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Cambiar arbol de directorios

Publicado por Tom (361 intervenciones) el 07/05/2014 15:22:06
Bueno, vamos avanzando ...
Lo primero es que eso _no_ es mucho mejor que tu sistema. Find debe recorrer todo el árbol de ficheros y directorios, incluso para poder mostrarte solamente un resultado.

También has de tener en cuenta que se usarán 3 procesos (uno por pipe más el principal) en lugar de uno y eso no es, ni mucho menos, óptimo.

Si realmente lo que quieres es moverlo "4 directorios más atrás":

1
find . -type d -mindepth 9 -exec mv {} "{}/../../../.." \;

Probablemente se generen errores (estás moviendo un directorio que find está listando) que tendrás que ignorar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Cambiar arbol de directorios

Publicado por Fernando (8 intervenciones) el 07/05/2014 15:51:14
Funciona perfecto, y mucho mas simple, pero no entiendo por que en el destino del mv se pone al contrario, que es lo que hace exactamente?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Cambiar arbol de directorios

Publicado por Tom (361 intervenciones) el 07/05/2014 18:13:21
Ummm ... eso es unix básico ... busca info sobre paths en unix (y mira sobre todo paths relativos).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Cambiar arbol de directorios

Publicado por Fernando (8 intervenciones) el 07/05/2014 18:19:29
si, si se lo que son los paths relativos, me refiero a que esta al contrario en las comillas, nunca se me habría ocurrido ponerlo así
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar