Automator :: Rimuovi la data a 6 cifre dal nome file; aggiungi data corrente


3

Chiedo scusa in anticipo se è stata data una risposta, ma ho effettuato una lunga ricerca nella speranza di una soluzione.

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

  • Input: Nomefile.txt
  • Output: Nome file_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 è fantastico ma dopo averlo usato regolarmente, mi sono reso conto che sarebbe bello non solo aggiungere la data corrente, ma prima controlla se una data è già stata aggiunta al nome del file; in tal caso, rimuoverlo e aggiungere la data corrente, altrimenti aggiungere semplicemente la data corrente.

Ci sono due scenari:

  1. Il nome file contiene qualsiasi data (precedente / attuale / futuro) nel formato a 6 cifre descritto precedentemente preceduto da un trattino basso (Nome file_181212.txt)
  2. Il nome file non contiene nel formato data a 6 cifre ad esso aggiunto (Nomefile.txt)

Mi rendo conto che la soluzione che spero rimuoverà ogni sei cifre e la precedente "_" se esiste, che sia una data o meno.

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

se una combinazione di numeri esiste immediatamente prima dell'estensione del file (".ext") AND contiene esattamente 6 cifre AND è preceduto da un trattino basso ("_")

quindi rimuovere il carattere di sottolineatura più 6 cifre ED eseguire il comando bash elencato sopra

in caso contrario, eseguire il comando bash sopra

Riepilogo Sto cercando di alleviare la rimozione manuale delle date che potrebbero esistere su un nome file prima di aggiungere loro la data corrente. Alcuni file potrebbero avere date e altri no.


Sì, ma in questo caso sembra che il comando date sia irrilevante perché è necessario trovare solo 6 cifre (più il carattere di sottolineatura precedente) indipendentemente dal fatto che si tratti di una data passata, precedente o futura.
Jeremy W,

scusa, ho cancellato il mio commento rendendomi conto che è stupido.
Ruskes,

La data nel nome del file non è Data, ma solo testo (numeri) ma la vediamo come data. Quindi se cancelli tutti i numeri nel nome del file funzionerà?
Ruskes,

Credo di si, ma anche "_" dovrà essere rimosso perché verrà aggiunto quando verrà aggiunta la data corrente. Come promemoria, se la data non esiste, non viene rimosso nulla; viene semplicemente passato al comando che aggiunge la data (che attualmente ho).
Jeremy W,

questo è un processo piuttosto chirurgico che stai chiedendo. E basta cancellare il nome del file e sostituirlo se con la data non è un'opzione per te.
Ruskes,

Risposte:


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

Si noti che quando viene utilizzato all'interno di un Run Shell script azione in un Automator flusso di lavoro , potrebbe essere necessario aggiungere il completo percorso a sednel codice fornito, ad esempio:/usr/bin/sed


Va bene. Per chiarezza, se cambio la variabile di 'basename' (e il suo riferimento nella variabile 'nome file') in qualcosa come 'nome file', allora non dovrebbe esserci un conflitto se usato direttamente nel terminale o nella riga di comando?
Jeremy W,

@Jeremy W, Sì, cambiarlo in qualcosa di diverso da un nome di comando esistente è una buona cosa da fare, 'filebasename' va bene o qualsiasi altra cosa che non sia esattamente "baesname" in questo caso d'uso. L'ho lasciato come l'avevi scritto in modo da poter vedere più facilmente quale codice ho aggiunto al tuo codice esistente. Lo aggiornerò nella mia risposta ora, so che ne sei consapevole. Inoltre, vedi la nota aggiornata.
user3439894,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.