¿Cómo muevo archivos de subdirectorios anidados a otra carpeta en ubuntu? (Intentando quitar muchas subcarpetas)

36

¿Cómo muevo archivos y no directorios a otra carpeta / carpeta principal?

Tengo una estructura de carpetas que es extremadamente fea, con algunos archivos .mp3 enterrados a 6 niveles de profundidad en una subcarpeta.

Quiero terminar con todos los archivos (principalmente .mp3 pero no todos) en un directorio, sin subdirectorios, usando Ubuntu.

¿Ayuda?

Chris
fuente

Respuestas:

48

Hay una gran respuesta en el askubuntu-QA .

Para hacerlo, abra una terminal y ejecute este comando:

mv  -v ~/Downloads/* ~/Videos/

Moverá todos los archivos y carpetas de la carpeta Descargas a la carpeta Videos.


Para mover todos los archivos, pero no las carpetas:

Pero, si está interesado en mover todos los archivos (pero no las carpetas) de la carpeta Descargas a la carpeta Videos, use este comando

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

Para mover solo archivos de las carpetas de Descarga, pero no de las subcarpetas:

Si desea mover todos los archivos de la carpeta Descargas, pero no los archivos dentro de las carpetas de la carpeta Descargas, use este comando:

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

aquí, la -maxdepthopción especifica qué tan profundo debe intentar la búsqueda profunda, es 1decir, solo el directorio especificado en el comando de búsqueda. Puedes intentar usar 2, 3también para probar.

Consulte la página de manual de búsqueda de Ubuntu para obtener una explicación detallada.

Fuente

Christian Wörz
fuente
Si lo que quiero hacer es copiar todos los archivos a la carpeta, ¿tendré que cambiar mv a cp? Soy nuevo en Linux
Neoryder
13

Solución

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

El comando encontrará todos los archivos normales en /src/dir(incluidos todos los subdirectorios) y los moverá al /dst/dirmediante el comando mv. Simplemente reemplace los directorios por los suyos. Los archivos con los mismos nombres serán renombrados automáticamente.

Seleccionar archivos para mover

Si desea mover solo archivos MP3, agregue la -iname "*.mp3"opción al findcomando después -type f.

Comparación con la respuesta de c0dev

Solo el segundo comando en la respuesta de c0dev responde la pregunta. A continuación se muestra cómo se compara con esta respuesta. Los puntos 3. y 4. pueden resolverse en la otra respuesta de la misma manera que aquí.

  1. Excepto que mvla solución con -exec +no necesita llamar a un comando adicional como xargso parallely entregar los nombres de archivo dos veces.
  2. La otra respuesta sobrescribirá silenciosamente los archivos que tengan el mismo nombre. Aquí los archivos se renombrarán automáticamente gracias a la opción --backup=numbered. Desafortunadamente, estas copias de seguridad con sufijo como ~3~estarán ocultas en la mayoría de los archivos administrados por defecto. Lamentablemente mv, no permite cambiar el sufijo, pero podría procesarse fácilmente mediante comandos adicionales. Esta es una extensión de GNU.
  3. Al contrario, -print0 -exec command {} +forma parte de los estándares IEEE Std 1003.1 (POSIX), ISO / IEC 9945 y The Single UNIX Specification. Por lo tanto, debería ser más portátil. Consulte IEEE Std 1003.1, Edición 2004 , IEEE Std 1003.1, Edición 2013 y 0000243: Agregue -print0 para "buscar" . Pero de todos modos, el -tcambio requerido de mves una extensión GNU, por lo que todo el comando no es portátil entre los sistemas POSIX.

Nota: En el caso findsería capaz de producir rutas que empiezan con -(no sé de cualquier implementación de finden este momento.) La {}debe ir precedida por el indicador de fin de opciones: --.

pabouk
fuente
Error: encontrar: falta el argumento para `-exec '
Chris
@ Chris: Tienes razón, parece que {}debe ser el último argumento. Corregido
Pabouk
@ Chris: ¿Funciona ahora como quisieras? En caso afirmativo, probablemente pueda aceptar la respuesta para que su pregunta no aparezca como "no resuelta".
pabouk
Esto es lo que estoy ejecutando, y obtengo errores de directorio no encontrado:
Chris
lo que estoy ejecutando: clstal @ clap: ~ $ ls 1st script.R Firefox_wallpaper.png part1vidproj zotero pdf manager Escritorio mozilla.pdf Imágenes Documentos padre Videos clstal @ clap: ~ $ find / source / directory -type f -exec mv -t / destination / directory {} + find: `/ source / directory ': No existe tal archivo o directorio
Chris
2

Desafortunadamente, no tengo una reputación lo suficientemente alta como para comentar sobre la solución marcada. Sin embargo, quería advertir a los demás sobre un problema que encontré. Es bastante aficionado; sin embargo, cuando está haciendo varias cosas, puede que no le venga a la mente al principio. Con suerte, ayudará a otros.

Problema

Se proporcionaron variaciones del siguiente mensaje después de iniciar el comando. El comando luego crea múltiples archivos.

mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file

Porque

El /srces un padre de la /dst(por ejemplo /src/../dst/).

Solución

Si bien puede haber una mejor solución, simplemente moví los archivos a un directorio temporal fuera de mi /srcy luego volví a ordenar el comando para volver a colocarlos en el /src/../dstdirectorio en el que quería que terminaran.

MackAltman
fuente
2

My one-liner: esto funciona en Mac pero también debería funcionar en cualquier * nix. Comience desde el directorio principal.

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf

La primera parte mueve todo, desde todas las subcarpetas a la carpeta real desde donde inicia el comando; la segunda parte comprueba si los subdirectores están vacíos (ahora deberían :-) y los elimina para que obtenga todo aquí sin subdirectores.

Archivo X
fuente
(1) Explique qué hace su respuesta y las ventajas que tiene sobre las otras respuestas (que son muy similares). Por favor no responda en los comentarios; edite  su respuesta para que sea más clara y completa. (2) Tenga en cuenta que el -notoperador no es estándar, por lo que su comando es menos portátil que los demás.
Scott
encontrar . -not -type d -print0 | xargs -0J% mv -f%. ; encontrar . -type d -depth -print0 | xargs -0 rm -rf Ejecuté este comando en una carpeta y eliminó las subcarpetas, la carpeta en la que estaba, y luego subí a la carpeta principal. Afortunadamente estaba viendo mi administrador de archivos y logré detener el comando y se ejecutó en una carpeta de prueba.
Será el
1

Abra el terminal, cd a su carpeta de carpetas con archivos y ejecútelos find . -mindepth 2 -type f -print -exec mv {} . \; para mover todos los archivos de estos subdirectorios al actual.

león
fuente