Moviendo archivos de subcarpetas a toda velocidad

Ayer tuve que mover, por motivos de políticas de respaldo, ya estamos cerca del fin de mes, una cantidad ingente de archivos. Estos archivos estaban anidados en muchas subcarpetas, pero a mi solo me interesaba guardar los archivos sin conservar la estructura de las carpetas. Claro que podemos abrir el explorador de archivos e ir navegando entre los archivos para cortarlos y pegarlos dentro de otra carpeta, pero eso toma mucho tiempo y es aburrido, además estamos en Linux (también funciona con macOS) y con la Terminal podemos hacerlo en unos momentos,veamos cómo se hace:

Consideraciones

Una consideración antes de esto, no sabía la cantidad concreta de archivos que se tenían y tampoco si estos estaban repetidos a lo largo de las carpetas, así que primero moveremos todos los archivos sin las carpetas a un solo directorio, además conservaremos los archivos en caso de tener los nombres duplicados, para asegurarnos que no borramos nada importante, después podemos filtrarlos para eliminar los duplicados, pero seriá tema de otra entrada.


El comando que tenemos que ejecutar es el siguiente:

find /directorio/origen -type f -exec mv --backup=numbered -t /directorio/destino {} +

Entendamos que estamos haciendo

find es el comando encargado de encontrar cosas, con la bandera -type f especificamos que se tratan de archivos.

mv es el comando que moverá todos los archivos encontrados por find y --backup=numbered se encargará renombrarlos, enumerándolos si se encontrarán dos archivos en el mismo nombre.

-exec sirve para enviar la salida de un comando como una secuencia del primer proceso, evitando que se inicien dos procesos para una sola acción.

{} + son opciones especificas de -exec, las llaves son para indicar que se trabaje con el nombre del archivo que se está procesando y el signo más es para reducir la cantidad de argumentos con los que se trabaja.

/directorio/origen y /directorio/destino son evidentes.

Personalizando el comando

En caso que sólo necesitemos mover un tipo de archivo en un montón de carpetas y subcarpetas, le indicaremos a find que tipo de archivos queremos encontrar, mediante su extensión con la bandera -iname "*.xyz", de forma que si queremos mover solo los archivos pdf el comando quedaría:

find /directorio/origen -type f -iname "*.pdf" -exec mv --backup=numbered -t /directorio/destino {} +


En caso de solo querer copiar esos archivos y dejar la estructura intacta reemplazamos el comando mover por copiar

find /directorio/origen -type f -iname "*.pdf" -exec cp --backup=numbered -t /directorio/destino {} +



Solo bastaría esperar unos segundos y los archivos estarían en la nueva carpeta.

Lo más leído

Elecciones 2024 en México. La historia se repite dos veces

Instala Gnome mínimo en Debian