Come rinominare in batch i file tramite Terminal utilizzando la data del file come nome file?

5

Ho un sacco di foto e video da fonti diverse e voglio normalizzare i nomi dei file usando Terminal. Ho esaminato diversi strumenti da NameChanger a Automator e Finder. NameChanger non consente più di un'azione alla volta e Finder e Automator non mi consentono di impostare il formato della data con una stringa di formato.

Ho giocato con alcune funzioni bash e ho scoperto che

stat -f "%Sm" -t "%Y-%m-%d %H.%M.%S" file.ext

produce il formato di data e ora che sto cercando.

Eppure ho trovato che

for file in *.*
do
    mv "$file" echo stat -f "%Sm" -t "%Y-%m-%d %H.%M.%S" "$file"
done

ritorna

-bash: syntax error near unexpected token 'done'

Non sono molto abile con lo scripting bash, quindi scusami qualsiasi incompetenza negli esempi precedenti.

Quello che voglio fare è rimuovere tutto il nome base del file (tutto prima di .jpg) e sostituirlo con il formato data e ora che ho ricevuto da stat in precedenza.

Ad esempio:

20160708_151344000_iOS.jpg   --> 2016-07-08 15.13.44.jpg
WP_20140915_02_03_15_Raw.jpg --> 2014-09-15 02.03.15.jpg

Come devo fare questo?

    
posta SebinNyshkim 01.07.2017 - 16:51
fonte

2 risposte

6
for f in *.*; do 
    echo mv "$f" "$(stat -f '%Sm' -t '%Y-%m-%d %H.%M.%S' "$f").${f##*.}"
done

O come one-liner:

for f in *.*; do echo mv "$f" "$(stat -f '%Sm' -t '%Y-%m-%d %H.%M.%S' "$f").${f##*.}"; done

In entrambi i casi, rimuovi il comando echo dopo il test.

La porzione ${f##*.} del comando ottiene l'estensione di $f , quindi puoi usare glob *.* vs. utilizzando un'estensione in for f in , ovvero for f in *.* rispetto a for f in *.jpg

    
risposta data 01.07.2017 - 17:38
fonte
3
for f in *.jpg; do
    echo mv "$f" "$(stat -f '%Sm' -t '%Y-%m-%d %H.%M.%S' "$f")".jpg
done

Rimuovi echo dopo aver verificato che il comando sembra ok.

    
risposta data 01.07.2017 - 17:20
fonte

Leggi altre domande sui tag