3 votes

Automator : : Supprimer la date à 6 chiffres du nom de fichier ; ajouter la date du jour

Je m'excuse par avance si cette question a déjà été traitée, mais j'ai effectué une longue recherche dans l'espoir de trouver une solution.

J'ai une application Automator fonctionnelle qui ajoute la date actuelle à six chiffres (AAMMJJ) à la fin du nom du fichier :

  • Entrée : Nom de fichier.txt
  • Sortie : Nom de fichier_181212.txt

Commande bash actuelle :

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

C'est très bien, mais après l'avoir utilisé régulièrement, j'ai réalisé que ce serait bien de ne pas seulement ajouter la date du jour, mais de vérifier d'abord si une date est déjà ajoutée au nom du fichier ; si c'est le cas, il faut la supprimer et ajouter la date du jour, sinon il faut simplement ajouter la date du jour.

Il y a deux scénarios :

  1. Le nom de fichier contient une date quelconque (antérieure/actuelle/future) dans le format à 6 chiffres décrit précédemment, précédé d'un trait de soulignement (Nom de fichier_181212.txt).
  2. Le nom de fichier ne contient pas de format de date à 6 chiffres annexé (Filename.txt)

Je me rends compte que la solution que j'espère supprimera tout chiffre à six chiffres et son "_" précédent s'il existe, qu'il s'agisse d'une date ou non.

Est-il possible de faire précéder ma commande bash actuelle de quelque chose comme :

si une combinaison de chiffres existe immédiatement avant l'extension du fichier fichier (".ext") ET contient exactement 6 chiffres ET est précédé d'un trait de soulignement ("_"). un trait de soulignement ("_")

puis supprimez l'underscore plus 6 chiffres ET exécutez la commande bash listée ci-dessus

Si ce n'est pas le cas, exécutez la commande bash ci-dessus

Résumé J'essaie d'éviter de supprimer manuellement les dates qui peuvent exister sur un nom de fichier avant d'y ajouter la date du jour. Certains fichiers peuvent avoir des dates et d'autres non.

0 votes

Oui, mais il semble que dans ce cas, la commande de date ne soit pas pertinente car seuls 6 chiffres (plus le trait de soulignement précédent) doivent être trouvés, qu'il s'agisse d'une date passée, précédente ou future.

0 votes

Désolé, j'ai supprimé mon commentaire en réalisant qu'il est stupide.

0 votes

La date dans le nom du fichier n'est pas une date, mais du texte brut (chiffres), mais nous la voyons comme une date. Donc, si vous supprimez tous les chiffres dans le nom du fichier, cela fonctionnera-t-il ?

2voto

user3439894 Points 52496

Cela devrait faire ce que vous avez demandé :

#!/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

Notez que lorsqu'il est utilisé dans un Exécuter le Shell script action dans un Automator flux de travail vous devrez peut-être ajouter le code complet chemin a sed dans le code fourni, par exemple : /usr/bin/sed

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X