• Compra una licencia de Windows 10/11 (10€) u Office (18€) al mejor precio u Office al mejor precio. Entra en este post con las ofertas
  • ¡Bienvenid@! Recuerda que para comentar en el foro de El Chapuzas Informático necesitas registrar tu cuenta, tardarás menos de 2 minutos y te dará valiosa información además de ayudarte en lo que necesites o pasar un rato agradable con nosotros.

Ejercicio bash ordenar carpetas, archivos y enlaces.

dane-sd

De profesión Chapuzas
Registrado
5 Jul 2015
Mensajes
308
Puntos
28
Hola. Estoy aprendiendo a realizar scripts con bash y me han mandado hacer un ejercicio que ordene carpetas, archivos y enlaces de dos formas distintas. Lo explico a continuación.

Tenemos dentro de una carpeta otras carpetas, archivos y enlaces. Se trata de organizar todo lo que hay dentro en otras carpetas: las carpetas moverlas a otra carpeta, los archivos a otra carpeta y los enlaces a otra carpeta. Se supone que tenemos que usar condiciones, es decir, preguntar si se trata de un archivo, etc. Eso de preguntar lo sé hacerlo. Lo que no me entero es qué comando tengo que usar para realizar la comparación. A ver si me explico:

Para preguntar si es una carpeta se hace con if [ -d $ruta ]. Lo que no me queda muy claro es si tengo que usar algún bucle para estar preguntando o es con comando. Estoy empezando a realizar scripts y de momento todo ha sido muy sencillo hasta que nos han mandado este ejercicio, por lo que o hay algo que no han explicado bien o soy yo que no me entero.

La segunda forma, si consigo realizar la primera, creo que es sencilla puesto que se trata de realizar un ls -l | cut y comparar si el primer caracter es un fichero, un directorio o lo que sea.
 
Te lo subo que ni fruta.
 
En teoria un for each funcionaria en este caso, me explico.

for variableAuxiliar in directorio
do
el test
done

No se que estructuras de control has usado hasta ahora, esa en teoria te va a meter en la variable auxiliar cada uno de los ficheros que hay dentro del directorio, uno por vuelta, y ya dentro de la iteracion haces lo que quieras con la variable auxiliar, en este caso el test y moverla a la carpeta segun corresponda.

Soy bastante paquete con bash, asique ojo a la sintaxis.
 
Sí, hemos dado bucles con for y while. Mañana lo pruebo. Ya había probado con for VAR in `comando`. A lo mejor no es necesario ningún comando. Pero ya digo que no ha explicado mucho, simplemente cómo funciona un for pero no qué posibilidades te da, o qué se puede usar en el for.

Según el profesor, es una chorrada de código, que en cuanto lo veamos, nos daremos cuenta enseguida de cómo funciona.
 
for variable in directorio.

El comando iria dentro del for
 
Hace mucho que no toco la shell pero con los pipes no deberia tirar?
un du la comprobación y uno de mover.
 
Pues no funciona con el for var in directorio. De esa forma me mueve la carpeta entera donde tengo los archivos. He probado a hacer un echo para ver qué hace el for y sólo me saca un echo donde está el directorio, es decir, que no muestra lo que hay dentro.

Hace mucho que no toco la shell pero con los pipes no deberia tirar?
un du la comprobación y uno de mover.
No te he entendido :borracho: Supongo que te refieres al ls -l. Esa es la segunda forma que tengo que hacerlo.
 
cuando ande por casa hago alguna prueba y te respondo con alguna idea, que hace como 4 años que no toco linux y no se si me acordare arrancarlo.

Prueba a hacer un du de un directorio.

lo que me refería era du | tu comprobacion + otras cosas, juraria que las | son pipes ¿no?
 
Ah vale, sí. Solo que nosotros usamos la palabra en castellano, tubería. Lo del du no me suena que lo hayamos dado, aunque muchas nos dice que busquemos por internet ya que no hay una única respuesta.
 
No se si me entendiste mal.
El for no hace nada de por si evidentemente, solo repite la acción de dentro por cada elemento dentro de la carpeta.

Script funcional.

for var in directorioArchivos/*
do
if [ -d "$var" ]
then
mv "$var" directorioCarpetas;
else if [ -f "$var" ]
then
mv "$var" directorioFicheros;
else if [ -L "$var"]
then
mv "$var" directorioEnlaces;
fi
fi
fi
done
 
No se si me entendiste mal.
El for no hace nada de por si evidentemente, solo repite la acción de dentro por cada elemento dentro de la carpeta.

Script funcional.

for var in directorioArchivos/*
do
if [ -d "$var" ]
then
mv "$var" directorioCarpetas;
else if [ -f "$var" ]
then
mv "$var" directorioFicheros;
else if [ -L "$var"]
then
mv "$var" directorioEnlaces;
fi
fi
fi
done

Sí, te había entendido. Vale, lo que me faltaba era el /*. Gracias. Que por cierto, hay que poner la separación de los enlaces primero porque si no los toma como archivos.

Mañana intentaré hacerlo de la segunda forma a ver si me sale.
 
Arriba