Tengo dos carpetas con estructuras de subcarpetas similares, que me gustaría comparar. Por ejemplo:
A 
├── child-1
├── child-2
├── child-3
├── child-4
├── child-5
y
B 
├── child-1-some-text
├── child-2-more-text
├── child-3-nothing
├── child-6-random-text
├── child-7-more-random-text
Me gustaría enumerar todas esas subcarpetas de las Acuales son prefijos para una subcarpeta By enumerar también las subcarpetas correspondientes B. La salida esperada es
child-1 -- child-1-some-text
child-2 -- child-2-more-text
child-3 -- child-3-nothing
Un requisito secundario: si hay varias coincidencias B, entonces debería dar un error / advertencia.
Mi solucion :
cd A
for f in `ls -d */`; 
do
    cd B;
    new_dirs=(`ls -1d $f*`);
    cd -;
    if [ ${#new_dirs[@]} -eq 0 ]
    then
        ## DO_Nothing
        continue;
    elif  [ ${#new_dirs[@]} -gt 1 ]
    then
        echo "Multiple matches to $f";
        continue;
    else
        echo "Unique Match found to $f -- ${new_dirs[0]}";
        continue;
    fi;    
done
Problema:
Para aquellos valores de $f, que no tienen subcarpetas correspondientes B, la construcción de la matriz me está dando un error. p.ej:
ls: no se puede acceder a 'child-4 *': no existe tal archivo o directorio
Pregunta
- ¿Cómo deshacerse de estos errores?
 - ¿Hay una mejor manera de lograr los objetivos que el que está en mi código?
 
¡Gracias por adelantado!

diff -rq DIR1 DIR2para comparar no solo la estructura de directorios, sino también el contenido de los archivos.Respuestas:
La mejor manera
No analizar
ls; use globos en su lugar. De hecho, ya estás usando globos, simplemente envolviéndolosls, lo cual no tiene sentido. Solo necesitasnullglobactivarlo cuando no hay coincidencias.Evitar también
cdsimplifica las cosas.Salida:
Agregué
B/child-3-somethingpara probar el requisito secundario. Esto crea la estructura de directorios para probar:Por cierto, ShellCheck es muy útil para encontrar problemas en los scripts de shell.
fuente
shellcheckpaquete sería lo más seguro]ShellCheck. ¡Me encantó la parte en la que no solo te dice tus errores, sino que también te da sugerencias! @ Xen2050, sobre la parte de carga, acabo de instalarshellcheckusandoapty luego deshabilité la red. Parece estar funcionando sin internet .Llamar
lsa una carpeta inexistente arroja el mensaje de error que encontró. La manera más fácil es simplemente ignorar esto mediante la sustitución de la línea 5 en el script con esto:new_dirs=(`ls -1d $f* 2> /dev/null`);.fuente
t=(`echo ok; echo err 1>&2`)$ t (o${t[@]}) solo contiene ok, err se ve en la terminal pero no se guarda de todos modos. ¿O hay algo gracioso en mi examen?