[Bash] Problema con array [resuelto]

Iniciado por hervasiop12345, 8 Julio 2011, 14:31 PM

0 Miembros y 1 Visitante están viendo este tema.

hervasiop12345

Hola. Quiero hacer un script que compare los ficheros de dos directorios. Para ello primero almaceno en dos arrays los ficheros de estos pero el problema está en que si el nombre de algún fichero tiene un espacio me lo guarda en dos posiciones del array. Dejo algo de código y gracias.
Código (bash) [Seleccionar]

#!/bin/bash

if test -d "$1"
then

 if test -d "$2"
 then

    dir1=(`cd $1; file * | grep -v "directory" | cut -f 1 -d ":"`)
    dir2=(`cd $2; file * | grep -v "directory" | cut -f 1 -d ":"`)

    for i in ${dir2[@]}
    do
      echo -e "$i\n"       #Aquí se observa lo dicho
    done    
 fi
fi


leogtz

Código (bash) [Seleccionar]
#!/bin/bash
declare -a carpetas=()
find . -maxdepth 1 -type d | grep -v "^\.$" > dirs
while read elemento
do
carpetas=("${carpetas[@]}" "$elemento");
done < ./dirs
echo -e "Elementos del arreglo : "
for i in `seq 0 1 $[ ${#carpetas[@]} - 1 ]`
do
echo -e "${carpetas[$i]}"
done
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

hervasiop12345

Muchas gracias por tu ayuda. Gracias a eso he avanzado pero me he visto de nuevo atascado ya que al comparar nombres de ficheros siendo alguno con espacio no lo hace bien. Debería de avanzar un array y avanza otro .Dejo el código con el que intentaba calcular la intersección de los directorios para que veas mejor a lo que me refiero:

#!/bin/bash

declare -a carpetas=()
declare -a carpetas2=()
i=0
j=0


if test -d "$1"
then

 if test -d "$2"
 then
 
    cd $1; find -maxdepth 1 ! \( -type d \)| cut -c 3- |sort > dirs
    while read elemento
    do

carpetas=("${carpetas[@]}" "$elemento")

    done < ./dirs
    cd $2; find -maxdepth 1 ! \( -type d \)| cut -c 3- |grep -v "dirs" |sort> dirs    
    while read elemento
    do

      carpetas2=("${carpetas2[@]}" "$elemento")

    done < ./dirs    
   
    tamanyo1=${#carpetas[@]}
    tamanyo2=${#carpetas2[@]}
           
   while true
   do
     fich="${carpetas[$i]}"
     fich2="${carpetas2[$j]}"
     echo $fich
     echo $fich2

     if [ "$fich" == "$fich2" ]
     then

       echo "El fichero "${carpetas[$i]}" es común a ambos directorios"
       let i=i+1
       let j=j+1

     elif [ "$fich" > "$fich2" ]
     then

       let j=j+1

     elif [ "$fich" < "$fich2" ]
     then

       let i=i+1
     fi

     if [ $i -eq $tamanyo1 ] || [ $j -eq $tamanyo2 ]
     then
       break
     fi
   done      
 fi
fi


leogtz

¿Qué tiene que hacer el script?
¿Cuál es la idea general?
¿Dónde crees que está el fallo?
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

hervasiop12345

El script recibe dos argumentos que son directorios. Si estos son correctos entonces tiene que ver que ficheros tiene uno que no tiene otro y mostrarlos diciendo este fichero está en tal directorio pero no en el otro. Para probar que funcionaba bien he intentado hacer la intersección de estos pero no funciona bien la comparación y creo que es por los espacios en los nombres de los ficheros.

hervasiop12345

Necesito saber como comparar dos nombres para ver cual es menor y cual mayor para así avanzar un array u otro pero tal y como lo tengo hecho parece que no funciona bien

leogtz

Comparar nombres respecto a longitud o a lexicograficamente cuál es mayor?
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

hervasiop12345

#8
lexicográficamente. Ya lo he resuelto , he cambiado de orden los if y funciona y bueno lo he terminado
Código:
http://pastebin.com/SzvxLD2P