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 A
cuales son prefijos para una subcarpeta B
y 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 DIR2
para 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 necesitasnullglob
activarlo cuando no hay coincidencias.Evitar también
cd
simplifica las cosas.Salida:
Agregué
B/child-3-something
para 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
shellcheck
paquete 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 instalarshellcheck
usandoapt
y luego deshabilité la red. Parece estar funcionando sin internet .Llamar
ls
a 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?