3 votos

Automator :: Eliminar la fecha de 6 dígitos del nombre del archivo; añadir la fecha actual

Pido disculpas de antemano si esto ya ha sido contestado pero he realizado una larga búsqueda con la esperanza de una solución.

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

  • Entrada: Filename.txt
  • Salida: Filename_181212.txt

Comando 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 estaría bien no sólo añadir la fecha actual, sino también comprobar primero si ya hay una fecha añadida al nombre del archivo; si es así, eliminarla y añadir la fecha actual, si no, simplemente añadir la fecha actual.

Hay dos escenarios:

  1. El nombre del archivo contiene cualquier fecha (anterior/actual/futura) en el formato de 6 dígitos descrito anteriormente precedido por un guión bajo (Filename_181212.txt)
  2. El nombre del archivo no contiene un formato de fecha de 6 dígitos (Filename.txt)

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

¿Es posible preceder mi comando bash actual con algo como

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

entonces elimine el guión bajo más 6 dígitos Y ejecute el comando bash listado arriba

Si no es así, ejecute el comando bash anterior

Resumen Estoy tratando de aliviar la eliminación manual de las fechas que pueden existir en un nombre de archivo antes de añadir la fecha actual a ellos. Algunos archivos pueden tener fechas y otros no.

0 votos

Sí, pero parece que en este caso, el comando de fecha es irrelevante porque sólo hay que encontrar 6 dígitos (más el guión bajo precedente) independientemente de si es una fecha pasada, anterior o futura.

0 votos

Lo siento, he borrado mi comentario al darme cuenta de que es estúpido.

0 votos

La fecha en el nombre del archivo no es una fecha, sólo texto plano (números) pero lo vemos como una fecha. Si se eliminan todos los números del nombre del archivo, ¿funcionará?

2voto

user3439894 Puntos 5883

Esto debería hacer lo que usted pidió:

#!/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 un Ejecutar Shell script acción en un Automatizador flujo de trabajo puede que tenga que añadir el camino a sed en el código siempre y cuando, por ejemplo: /usr/bin/sed

0 votos

Bien. Para mayor claridad, si cambio la variable de 'basename' (y su referencia en la variable 'filename') por algo como 'filebasename' entonces no debería haber un conflicto si se usa directamente en la terminal o línea de comandos?

0 votos

@Jeremy W, Sí, cambiarlo a cualquier cosa que no sea un nombre de comando existente es una buena cosa que hacer, 'filebasename' está bien o cualquier otra cosa que no sea exactamente "baesname" en este caso de uso. Lo dejé como lo escribiste originalmente para que pudieras ver más fácilmente qué código añadí a tu código existente. Lo actualizaré en mi respuesta ahora que sé que eres consciente de ello. También, vea la nota actualizada.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X