Le date di creazione della modifica del 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, quindi questo viene fatto 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/(.*)(..)/./')
    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 comando della funzione sed per elaborare la conversione nel formato corretto per il tocco?

    
posta Brent 06.05.2017 - 02:26
fonte

3 risposte

6

L'espansione dei parametri di 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 di (< 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
    
risposta data 06.05.2017 - 04:34
fonte
4

Dato che hai chiesto come potresti modificare ciò che hai già fatto, cambieresti i gruppi di cattura nella prima occorrenza di sed per far corrispondere il nuovo modello, lasciando il secondo sed così com'è. Inoltre, raddoppia il $f in echo "$f" | .

Tuttavia, ho eliminato l'uso della pipe e la seconda occorrenza di sed , | sed ... , utilizzando l'opzione -e , 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/(.*)(..)/./')
    touch -t $t "$f"
done

Qui è ottimizzato come one-liner:

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

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

Che ti lascia con 20160905115236 e quando viene elaborato dal secondo comando sed , diventa 201609051152.36 come (.*)(..) scomposizione in due gruppi di cattura, il secondo contenente gli ultimi due caratteri e il primo contenente tutto il resto Il . viene inserito nella porzione di sostituzione avente riferimenti indietro /./ in entrambi i gruppi di cattura.

    
risposta data 06.05.2017 - 07:51
fonte
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.

link

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.

    
risposta data 06.05.2017 - 05:42
fonte

Leggi altre domande sui tag