En lugar de usar find
(lo que hace bien el trabajo), también podría usar el shell para este fin.
Digamos que desea todos los archivos de $ PWD a $ DEST. El intento natural sería:
mv $PWD/* $DEST
¿Como funciona esto? La expresión "$ PWD / *" se expande a los nombres de todos los archivos en ese directorio. Esta característica de shell se llama "globbing". El último argumento de mv
es el directorio de destino. Si tiene muchos archivos, esto no funcionará porque la longitud de la línea de comando es limitada.
Pero la solución tiene el problema de que omite archivos de puntos, o archivos, archivos y directorios "ocultos" cuyo nombre comienza con un ".". Para resolver esto, debe decirle a su shell que incluya archivos de puntos cuando haga glob. Para hacer esto, use
shopt -s dotglob
cuando se usa bash
(y probablemente lo use a bash
menos que haya cambiado el valor predeterminado). En este shell, el comando anterior también funcionará para los archivos de puntos.
Como comentario adicional, en zsh
, tiene la opción de elegir esto caso por caso. Para hacer esto, pon
setopt extendedglob
en su .zshrc
. Entonces puedes usar
mv $PWD/*(D) $DEST
para mover todos los archivos, incluidos los archivos de puntos. (La "D" tiene el efecto de habilitar temporalmente la opción "GLOB_DOTS").
Ahora la pregunta original era mover todos los archivos normales (no directorios) de todos los subdirectorios y sus subdirectorios a un solo directorio. Esto se puede lograr con zsh
:
mv $PWD/**/*(D.)
Aquí la expresión **/*
hace que el globber descienda recursivamente en subdirectorios. Los D
medios "también seleccionan archivos de puntos"; los .
medios "solo seleccionan archivos regulares, no directorios".