[bash] Dividir 1 ruta en n directorios

Imagen de sir_poisonous
0 puntos

hola , vereis lo que quiero conseguir es dada una ruta por ej /home/quiensea/Desktop y conocido el numero de directorios que la forman en este caso 3 es ir obteniendo los directorios por separado.

Se me ocurrio hacer algo asi, pero no parece ser posible poner 1 variable como parametro para el cut

for ((i=0;i<ndir;i++)

do

directorio=`cut -f $i -d '/'`

echo $directorio

done

 

en que falla? sabeis alguna alternativa?

gracias! 

Imagen de joseluis
+1
0
-1

El problema está en que al cut no le estás pasando qué es lo que tiene que cortar. Además estás intentando cortar (en la iteración inicial) el campo 0 pero cut entiende a partir del 1.
En lugar de

  directorio=`cut -f $i -d '/'`

debería ir

directorio=`echo $variable_donde_este_el_directorio | cut -d"/" -f $(($i+1))`

Así el script podría quedar de la forma:


#!/bin/bash
ndir=`echo $1 | sed "s/\//\n/g" | wc -l`

for ((i=0;i < ndir; i++))
do 
  directorio=`echo $1 | cut -d"/" -f $(($i+1))`
  echo $directorio
done

El problema que tiene el método anterior es que si el directorio comienza por / (es decir es la ruta absoluta) lo primero que cortará el cut será algo vacío (lo que está a la izquierda del primer /), es decir si el directorio es /home/usuario sacará una línea vacía antes de home:


home
usuario

Se podría comenzar el bucle en 1 en lugar de 0 para evitarlo pero entonces no serviría si el directorio es una ruta relativa.
Otra posibilidad que evita ese problema (sirve tanto para rutas absolutas como relativas) puede ser el siguiente script:

#!/bin/bash

tdir=`echo $1 | sed "s/ /#ESPACIO#/g" | sed "s/\// /g"`
for i in $tdir ; do
   echo $i | sed "s/#ESPACIO#/ /g"
done

Y otra más usando arrays (en bash sí existe pero en ksh, csh y otras shell no existen):

#!/bin/bash

tdir=(`echo $1 | sed "s/ /#ESPACIO#/g" | sed "s/\// /g"`)
for ((i=0; i < ${#tdir[@]}; i++))
do
   echo ${tdir[$i]} | sed "s/#ESPACIO#/ /g"
done

Si se sabe que los directorios no contienen espacios se puede prescindir de sed "s/ /#ESPACIO#/g" y por tanto también de sed "s/#ESPACIO#/ /g"


Lectura obligada:
+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de sir_poisonous
+1
0
-1

Vaya , muchas gracias. Al final decidi empezar el bucle en 1 y transformar todas las rutas a rutas absolutas antes de dividirlas en directorios.

Gracias d nuevo, 1 saludo. 

+1
0
-1