Le date di creazione del cambiamento batch si basano sui nomi dei file


4

Ho file che sono denominati come "12. 2017-04-11 063118.jpg" e "123. 2016-09-05 115236.jpg". Il numero a sinistra del "." conta come un indice da 1 a 1400.

Come posso impostare la data e l'ora di creazione in base a come è specificato nel nome del file per tutti i 1400 file che ho nella cartella. So che il comando touch -t cambia la data di creazione, ma non so come estrarre le informazioni di data / ora dal nome del file e inserirle in un comando, in modo che questo avvenga automaticamente per tutti i file.

So da un altro thread che il sotto dovrebbe funzionare. ma non so come modificare la conversione del testo per applicare correttamente alla convenzione di denominazione dei file.

for f in *; do
    t=$(echo $f | sed -E 's/([A-z]*-)|([ ,;])|(\..*)//g' | sed -E 's/(.*)(..)/\1.\2/')
    touch -t $t "$f"
done

Il codice sopra riportato funziona se la convenzione di denominazione dei file è come "clip-2014-01-31 18; 50; 15.mp4", tuttavia, ho un formato diverso: "12. 2017-04-11 063118.jpg", e "123. 2016-09-05 115236.jpg". Qualcuno sa come modificare il sed comando di funzione per elaborare la conversione nel formato corretto per il tocco?

Risposte:


6

L'espansione del parametro Bash funzionerà:

for f in *; do
    t="${f#* }"
    t="${t%%.*}"
    t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}"
    touch -t $t "$f"
done
  • t="${f#* }" toglie la parte prima (& lt; il primo spazio)
  • t="${t%%.*}" toglie la parte dopo .
  • t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}" formatta il contenuto della variabile data (t) per il tocco che richiede il seguente formato: [[CC] AA] MMDDhhmm [.SS].

E come one-liner:

for f in *; do t="${f#* }"; t="${t%%.*}"; t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}"; touch -t $t "$f"; done

Il bare * (glob) elencherà ogni oggetto del file system nella directory. Pensi che usando *.jpg sarebbe una scelta migliore?
fd0

@ fd0 La soluzione funzionerà solo per il formato specificato something_without_spaces YYYY[.|-|:]MM[.|-|:]DD hhmmSS.someextension. Non cambierà la data di creazione se il formato richiesto CCYYMMDDhhmm.SS è sbagliato (ad esempio contiene lettere o se manca il punto).
klanomath

4

Poiché hai chiesto come potresti modificare ciò che hai già fatto, cambieresti i gruppi di cattura nella prima occorrenza di sed per abbinare il nuovo modello, lasciando il secondo sed come è. Anche la doppia citazione del $f nel echo "$f" |.

Nota comunque, ho eliminato l'uso della pipe e la seconda occorrenza di sed, | sed ..., mediante l'uso del -e opzione, che aggiunge i comandi di modifica a un elenco di comandi.

for f in *; do
    t=$(echo "$f" | sed -E -e 's/(.*\. )|([-])|([ ])|(\..*)//g' -e 's/(.*)(..)/\1.\2/')
    touch -t $t "$f"
done

Qui è ottimizzato come one-liner:

for f in *; do t=$(echo "$f" | sed -E -e 's/(.*\. )|([-])|([ ])|(\..*)//g' -e 's/(.*)(..)/\1.\2/'); touch -t $t "$f"; done

Ecco una spiegazione dei gruppi di cattura nel primo sed comando di modifica:

enter image description here

Che ti lascia con 20160905115236 e quando elaborato dal secondo sed comando di modifica, diventa 201609051152.36 come (.*)(..) lo suddivide in due gruppi di cattura, il secondo contiene gli ultimi due caratteri e il primo contiene tutto il resto. Il . viene inserito nella parte di sostituzione avente riferimenti retroattivi /\1.\2/ entrambi catturano i gruppi.


0

Se i file contengono tag di uscita, il 'exiftool' gratuito può cambiare il nome del file in base ai valori all'interno del file. L'installazione installa anche una pagina man dettagliata.

http://www.sno.phy.queensu.ca/~phil/exiftool/

Ho usato questo strumento non solo per cambiare i nomi dei file, ma per scrivere snippet HTML per mostrare i file su una pagina web.


OK, mio ​​male. Leggendolo di nuovo, vedo che vuoi cambiare le date del file, non il nome. Può essere che exiftool possa farlo. Il mio MAC non funziona, quindi non posso leggere la pagina man.
WGroleau
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.