En zsh:
mv dir1/*/**/*(.D) dir1
**/
recorre subdirectorios de forma recursiva. El calificador global solo .
coincide con los archivos normales y D
garantiza que se incluyan los archivos de puntos (de forma predeterminada, los archivos cuyo nombre comienza con a .
se excluyen de las coincidencias con comodines). Para limpiar los directorios ahora vacíos después, ejecute rmdir dir1/**/*(/Dod)
: /
restringe a los directorios y od
ordena primero la profundidad de las coincidencias para eliminarlas dir1/dir2/dir3
antes dir1/dir2
.
Si la longitud total de los nombres de archivo es muy grande, puede encontrar una limitación en la longitud de la línea de comando. Zsh tiene incorporados para mv
y rmdir
que no se ven afectados por esta limitación: ejecutar zmodload zsh/files
para habilitarlos.
Con solo herramientas POSIX:
find dir1 -type f -exec mv {} dir1 \;
find dir1 -depth -exec rmdir {} \;
o (más rápido porque no tiene que ejecutar un proceso separado para cada archivo)
find dir1 -type f -exec sh -c 'mv "$@" dir1' _ {} +
find dir1 -depth -exec rmdir {} +