¿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.

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 {} \;

¿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 %


0

Bash 4:

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

-2

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

mv *.* subdir/
mv .* subdir/

-2

Solo ejecuta este comando :-)

mv **/*.* .


1
Eso no encontrará archivos que no tengan una . en su nombre, ¿lo hará?
G-Man
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.