Ordenar archivos por nombre de archivo

Ordenar archivos por nombre de archivo

Estoy intentando ordenar mis archivos por patrón en nombre de archivo creando un script de Linux (Bash).

Mis archivos son en su mayoría .JPG, algunos .AV y .MP4. No puedo usar metaetiquetas porque estos archivos tienen etiquetas rotas (restauradas tras un fallo de RAID).

La mayoría de mis archivos tienen etiquetas como esta Seaxxx_A01_xxx.jpg o Beach_xxx_A01A02_xxx.jpg o Mountain_xxx_A04A12_xxx.jpg (esta es mi referencia para quién tomó fotografías y dispositivo, es decir: cámara, réflex, etc.).

Mi necesidad es colocar el archivo en la carpeta y subcarpeta correcta, según el nombre del archivo.

Creo que lograr esta tarea de esta manera:

use buscar, busque el patrón [AZ][0-2][0-6] o [AZ][0-2][0-6][AZ][0-2][0-6], cuando este patrón se encuentra, busque la primera parte del nombre del archivo (es decir, Mar, playa, montaña, familia, etc..., siempre colocada como la primera palabra, normalmente no tengo nada más antes) y use la primera parte para buscar una carpeta con un nombre similar y colóquela (si mi archivo contiene: Sea_Royan_xxx_A04A10_xxx.jpg y solo tengo una carpeta llamada "Sea", debo colocarla).

En cada carpeta, hay subcarpetas, como A01, A02, A03, A04 o Dio, Sandy, Mael, etc... y quiero el archivo encontrado actualmente (es decir, el mismo que se usó para colocarlo en la carpeta principal, Sea, montaña, etc...) se debe verificar si el segundo patrón enumerado anteriormente se debe usar para colocarlo en la subcarpeta correcta.

De hecho, y de manera más sencilla, necesito: buscar archivos, cuando los encuentre, verifique el nombre del archivo y use dos patrones para moverlo a la carpeta y subcarpetas correctas.

Déjeme saber cómo puedo hacerlo (sé cómo buscar archivos, según el patrón, pero no cómo leer el nombre de archivo encontrado actualmente y en este nombre de archivo verificar si hay dos patrones que se usarán como RUTA correcta), si tiene más La forma más fácil o mejor de hacerlo, ¡no dudes en hacérmelo saber!

Respuesta1

He aquí una posible solución, aunque probablemente no sea la más bonita ni la más original. La idea es utilizar expresiones regulares en awk para extraer los bits relevantes de los nombres de los archivos. Luego pasamos a construir el comando shell move (mv) en awk. Finalmente usamos el comando del sistema disponible en awk para ejecutar el comando y mover los archivos a las subcarpetas adecuadas.

Pruebe esto primero para obtener una descripción detallada:

find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd }'

Resultado:

Command to be run:  mv ./Seaxxx_A01_xxx.jpg ./Seaxxx/A01
Command to be run:  mv ./Mountain_xxx_A04A12_xxx.jpg ./Mountain/A04A12
Command to be run:  mv ./Beach_xxx_A01A02_xxx.jpg ./Beach/A01A02

Para ejecutar realmente el comando, agregue system(cmd) al final de la declaración:

find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd; system(cmd) }'

Lo único que probablemente querrás es ajustar la expresión regular a tus necesidades. Supongo que está familiarizado con las expresiones regulares; aquí capturamos dos partes de los nombres de los archivos. Los grupos de captura están entre paréntesis.

Comenzando desde el principio del nombre del archivo, tomamos todo lo que no está subrayado, hasta que encontramos un guión bajo. Luego seguimos buscando hasta encontrar el patrón A#####, donde # representa letras/dígitos (el segundo grupo de captura). Capturamos hasta llegar al siguiente guión bajo.

información relacionada