Categorías
hoy aprendí ...

… a ordenar archivos en carpetas según el patrón de nombre

Descargando un montón de referencias desde Instagram usando esta maravillosa extensión, Instagram Download Button, me llené de archivos JPG y MP4 y se hacía necesario ordenarlos en carpetas.

El patrón es que todos los archivos tienen en la primer parte del nombre la perfil de Instagram y luego la fecha y hora original del posteo seguidos de un choclazo de números, así que tendría que ser «relativamente» sencillo poder encarpetarlos identificando el perfil.

nombre_perfil-YYYYMMDD_HHMMSS-XXXXXXXXX….. [jpg|mp4]

Buscando en encontré varias propuestas aproximadas para hacer algo como lo que quería

Y la opción ganadora

Extract part of a file name in bash

Específicamente esta respuesta que utiliza el comando SED. La única condición es que la primera parte no sean numeros.

El escenario

I have a folder with lots of files having a pattern, which is some string followed by a date and time:

BOS_CRM_SUS_20130101_10-00-10.csv (3 strings before date)
SEL_DMD_20141224_10-00-11.csv (2 strings before date)
SEL_DMD_SOUS_20141224_10-00-10.csv (3 strings before date)

I want to loop through the folder and extract only the part before the date and output into a file.

Output
BOS_CRM_SUS_
SEL_DMD_
SEL_DMD_SOUS_

La propuesta

Assuming you wont have numbers in the first part, you could use:

$ for i in *csv;do  str=$(echo $i|sed -r 's/[0-9]+.*//'); echo $str; done
BOS_CRM_SUS_
SEL_DMD_
SEL_DMD_SOUS_

Prueba

Cuando hice la prueba, solo mostrando el resultado del SED, funcionaba casi como lo deseaba, con el único tema que era que procesaba algunos archivos con otros patrón de nombre (que no eran necesarios) y los que si debía procesar dejaba el guión del medio.

Ejemplo:

almendromaestro-20220602_195749-285312905_1062446314350240_327302066906487345_n.jpeg

> almendromaestro-

Mi modificación a la RegExp

Agregar un guión que aparece antes de la regla para la fecha, así sólo busca los archivos que se aproximan al patrón.

sed -r 's/-[0-9]+.*//'

y pasó el testeo!

Script terminado

Básicamente hace un loop en todos los archivos que haya en la carpeta, separa el nombre y la almacena en STR (y lo mostramos para ir viendo el progreso), usa eso para verificar que si no existe una carpeta la crea, y luego mueve el archivo a la carpeta.

#!/bin/sh

for i in *.*
do
  str=$(echo $i|sed -r 's/-[0-9]+.*//'); 
  echo $str;
  if [ ! -d $str ]; then
      mkdir $str
  fi
  mv $i $str
done

Y chau!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *