Děkujeme @John1024!
Potřeboval jsem přejmenovat soubory s různými příponami ve stejnou dobu, podle data poslední úpravy:
for f in *; do
fn=$(basename "$f")
mv "$fn" "$(date -r "$f" +"%Y-%m-%d_%H-%M-%S")_$fn"
done
"DSC_0189.JPG" ➜ "2016-02-21_18-22-15_DSC_0189.JPG"
"MOV_0131.avi" ➜ "2016-01-01_20-30-31_MOV_0131.avi"
Pokud nechcete zachovat původní název souboru:
mv "$fn" "$(date -r "$pathAndFileName" +"%Y-%m-%d_%H-%M-%S")"
Doufám, že to pomůže noobům jako mně!
Pojmenování podle data systému souborů
V linuxovém prostředí:
for f in *.jpg
do
mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"
done
Vysvětlení :
-
for f in *.jpg doTím se spustí smyčka nad všemi soubory jpeg. Jeho rysem je, že bude fungovat se všemi názvy souborů, včetně těch s mezerami, tabulátory nebo jinými složitými znaky v názvech.
-
mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"Tím dojde k přejmenování souboru. Používá
-rmožnost, která říkádatepro zobrazení data souboru namísto aktuálního data. Specifikace+"%Y%m%d_%H%M%S"říkádatejej naformátujte tak, jak jste zadali.Název souboru
$f, je umístěn v dvojitých uvozovkách, kdekoli je použit. To zajišťuje, že liché názvy souborů nezpůsobí chyby.-nmožnostmvříká move nikdy nepřepsat existující soubor. -
doneTím je smyčka dokončena.
Pro interaktivní použití můžete dát přednost tomu, aby byl celý příkaz na jednom řádku. V takovém případě použijte:
for f in *.jpg; do mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"; done
Pojmenování podle data vytvoření EXIF
K pojmenování souboru podle data vytvoření EXIF (místo data systému souborů) potřebujeme exiftool nebo ekvivalentní:
for f in *.jpg
do
mv -n "$f" "$(exiftool -d "%Y%m%d_%H%M%S" -CreateDate "$f" | awk '{print $4".jpg"}')"
done
Vysvětlení :
Výše uvedené je velmi podobné příkazům pro datum souboru, ale s použitím exiftool a awk pro extrahování data vytvoření obrázku EXIF.
-
exiftoolpříkaz poskytuje datum ve formátu jako:$ exiftool -d "%Y%m%d_%H%M%S" -CreateDate sample.jpg Create Date : 20121027_181338Skutečné datum, které chceme, je čtvrté pole ve výstupu.
-
Předáme
exiftoolvýstup naawkaby mohl extrahovat pole, které chceme:awk '{print $4".jpg"}'Tím se vybere pole data a přidá se také
.jpgrozšíření.
Zkuste toto
for file in `ls -1 *.jpg`; do name=`stat -c %y $file | awk -F"." '{ print $1 }' | sed -e "s/\-//g" -e "s/\://g" -e "s/[ ]/_/g"`.jpg; mv $file $name; done
I když může existovat jednodušší způsob.