¿Mover todos los archivos de los subdirectorios al directorio actual?

9

¿Cómo puedo mover los archivos contenidos en todos los subdirectorios al directorio actual y luego eliminar los subdirectorios vacíos?

encontré esta pregunta , pero adaptando la respuesta a:

mv * .

no funcionó; Recibí muchas advertencias que parecían:

mv: wil and ./wil are identical

Los archivos contenidos en los subdirectorios tienen nombres únicos.

Richard
fuente

Respuestas:

15

También puedes usar el -mindepth opción:

find . -type f -mindepth 2 -exec mv -i -- {} . \;

(Juntos con -maxdepth también podría limitar los niveles de jerarquía desde los cuales recopilar los archivos.)

solía mv -i ("Interactivo") para hacer mv Preguntar antes de sobrescribir archivos. Con una gran cantidad de subdirectorios, puede haber conflictos de nombres sobre los que le gustaría ser advertido.

los -- opción detiene el procesamiento de opciones, por lo que mv no se confunda con los nombres de archivo que comienzan con un guión.

Limpia todo el grupo de subdirectorios vacíos con

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
Florian Jenn
fuente
¿Hay también una manera de saltear la pregunta para sobrescribir los archivos al no sobrescribirlos?
Filnor
1
Opciones para mv: -n, --no-clobber: no sobrescribir un archivo existente. Te podría interesar -b, --backup, también.
Florian Jenn
4

Prueba esto:

find ./*/* -type f -print0 | xargs -0 -J % mv % .

Más información: pruebe la instrucción de búsqueda solo, debería darle una lista con todos los archivos que desea mover (omita el -print0 ). Ejemplo:

probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7

con -print0 y xargs ahora estás creando una lista de sentencias para ser ejecutadas. los -J % bandera significa, inserte el elemento de lista aquí, por lo que mv $FILE . Se ejecuta para cada archivo encontrado.

Lo anterior está funcionando para los BSD xargs. Si está utilizando la versión GNU (Linux) -I % en lugar de -J %

trurl
fuente
0

Bash 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done
ata
fuente
-2

1 truco rápido, solo funciona si sus archivos tienen extensiones (con un punto):

mv *.* subdir/
mv .* subdir/
Guillermo
fuente
-2

Solo ejecuta este comando :-)

mv **/*.* .

Paul Digi
fuente
1
Eso no encontrará archivos que no tengan una . en su nombre, ¿lo hará?
G-Man