En zsh:
mv dir1/*/**/*(.D) dir1
**/recorre subdirectorios de forma recursiva. El calificador global solo . coincide con los archivos normales y Dgarantiza 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 odordena primero la profundidad de las coincidencias para eliminarlas dir1/dir2/dir3antes 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 mvy rmdirque no se ven afectados por esta limitación: ejecutar zmodload zsh/filespara 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 {} +