Soy nuevo en la programación de scripts de shell. Supongamos que tenemos una jerarquía de archivos como esta:
/A/B/C/D
/A/B/E/F/G
/A/H/I
/A/H/J/K
Tenga en cuenta que aquí no sólo tenemos /A/B/..
, sino también /A/H/...
. Todas las cartas son directorios. Nos gustaría transformar la jerarquía en:
/A/B/C
/A/B/D
/A/B/E
/A/B/F
/A/B/G
/A/H/I
/A/H/J
/A/H/K
Es decir, mover todos los directorios a una profundidad mayor que dos (el directorio A tiene profundidad cero), a la profundidad dos. Puedo usar JAVA y C para implementarlo, pero son un poco lentos. ¿Alguien sabe cómo utilizar un script de shell para implementarlo?
El pseudocódigo es el siguiente:
for each directory D in current directory A // A may have more than one subdirectories
for each directory d in D
for each object in d
if object is a directory
move object and all descendant subdirectories of object to /A/D;
end if
end for
end for
end for
Respuesta1
for dir in /A/*; do
find "$dir" -mindepth 2 -depth -type d -exec mv -t "$dir" -- {} +
done
Esto indica find
buscar todos los directorios ( -type d
) al menos 2 niveles por debajo ( -mindepth 2
) $dir
en profundidad primero ( -depth
). Para cada objeto que encuentra, ejecuta mv -t "$dir" -- <SRC>
. Como siempre, mv
no le permite fusionar un directorio de origen con un directorio de destino existente (pero hay formas de evitarlo).