Automator :: Rimuovi la data di 6 cifre dal nome del file; aggiungere la data corrente

4

Mi scuso in anticipo se è stata data una risposta, ma ho fatto una lunga ricerca nella speranza di una soluzione.

Ho un'app Automator funzionante che aggiunge la data corrente di sei cifre (YYMMDD) alla fine del nome del file:

  • Input: Filename.txt
  • Output: nomefile_181212.txt

Comando bash corrente:

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

Questo è ottimo ma dopo averlo usato regolarmente, ho realizzato che sarebbe bello non solo aggiungere la data corrente ma prima controllare se una data è già stata aggiunta al nome del file; in tal caso, rimuovilo e aggiungi la data corrente, altrimenti aggiungi semplicemente la data corrente.

Ci sono due scenari:

  1. Nome file contiene una data (precedente / corrente / futura) nel formato a 6 cifre descritto in precedenza preceduto da un trattino basso (Nome file_181212.txt)
  2. Il nome file non contiene il formato data a 6 cifre aggiunto (Filename.txt)

Mi rendo conto che la soluzione che spero rimuoverà qualsiasi sei cifre e il suo precedente "_" se esiste, che si tratti di una data o meno.

È possibile precedere il mio attuale comando bash con qualcosa del tipo:

if any combination of numbers exist immediately before the file extension (".ext") AND contains exactly 6 digits AND is preceded by an underscore ("_")

then remove the underscore plus 6 digits AND run the bash command listed above

if not then run the bash command above

Sommario Sto cercando di alleviare manualmente la rimozione delle date che possono esistere su un nome di file prima di aggiungerle alla data corrente. Alcuni file potrebbero avere date e altri no.

    
posta Jeremy W 12.12.2018 - 21:12
fonte

1 risposta

2

Questo dovrebbe fare come richiesto:

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

Tieni presente che, se utilizzato all'interno di Esegui script shell azione in un flusso di lavoro Automator , potrebbe essere necessario aggiungi il percorso completo a sed nel codice fornito, ad esempio: /usr/bin/sed

    
risposta data 13.12.2018 - 02:17
fonte

Leggi altre domande sui tag