Automator :: Eliminar fecha de 6 dígitos del nombre de archivo; anexar fecha actual

4

Pido disculpas por adelantado si esto ha sido respondido, pero he realizado una larga búsqueda con la esperanza de una solución.

Tengo una aplicación Automator que funciona y agrega la fecha actual de seis dígitos (YYMMDD) al final del nombre del archivo:

  • Entrada: Nombre de archivo.txt
  • Salida: Nombre de archivo_181212.txt

Comando de bash actual:

today=$(date +%y%m%d)
for f in "$@"
do
    basename=${f##*/}
    filename=${basename%.*}
    path=${f%/*}
    ext=${f##*.}
    newfilename="$filename"_"$today"
    mv "$f" "$path"/"$newfilename"."$ext"
done

Esto es genial, pero después de usarlo regularmente, me he dado cuenta de que sería bueno no solo agregar la fecha actual, sino verificar primero si la fecha ya está adjunta al nombre de archivo; si es así, elimínelo y agregue la fecha actual; de lo contrario, simplemente agregue la fecha actual.

Hay dos escenarios:

  1. Nombre de archivo contiene cualquier fecha (anterior / actual / futuro) en el formato de 6 dígitos descrito anteriormente precedido por un guión bajo (Nombre de archivo_181212.txt)
  2. El nombre de archivo no contiene el formato de fecha de 6 dígitos que se le anexa (Filename.txt)

Me doy cuenta de que la solución que espero eliminará cualquiera de los seis dígitos y su "_" precedente, si existe, sea una fecha o no.

¿Es posible preceder mi comando de bash actual con algo como:

  

si existe una combinación de números inmediatamente antes del archivo   la extensión (".ext") AND contiene exactamente 6 dígitos AND está precedida por   un guión bajo ("_")

     

luego elimina el guión bajo más 6 dígitos Y ejecuta el comando bash   listado arriba

     

si no es así, ejecute el comando bash anterior

Resumen Intento eliminar manualmente las fechas que puedan existir en un nombre de archivo antes de agregarles la fecha actual. Algunos archivos pueden tener fechas y otros pueden no.

    
pregunta Jeremy W 12.12.2018 - 21:12

1 respuesta

2

Esto debería hacer lo que solicitaste:

#!/bin/bash

today=$(date +%y%m%d)

for f in "$@"; do

    filebasename=${f##*/}
    filename=${filebasename%.*}
    path=${f%/*}
    ext=${f##*.}

    if [[ "$filename" =~ ^.*_[0-9]{6}$ ]]; then

        filename="$(sed -E -e 's/_[0-9]{6}$//'<<<"$filename")"

        newfilename="$filename"_"$today"
        mv "$f" "$path"/"$newfilename"."$ext"   

    else    

        newfilename="$filename"_"$today"
        mv "$f" "$path"/"$newfilename"."$ext"

    fi

done

Tenga en cuenta que cuando se utiliza dentro de una Ejecución del script de shell en un Automator flujo de trabajo , es posible que deba agregue la ruta completa a sed en el código provisto, por ejemplo: /usr/bin/sed

    
respondido por el user3439894 13.12.2018 - 02:17

Lea otras preguntas en las etiquetas