GNU/Linux >> Znalost Linux >  >> Linux

linux-shell:přejmenování souborů na čas vytvoření

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 do

    Tí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á -r možnost, která říká date pro zobrazení data souboru namísto aktuálního data. Specifikace +"%Y%m%d_%H%M%S" říká date jej 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.

    -n možnost mv říká move nikdy nepřepsat existující soubor.

  • done

    Tí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.

  • exiftool příkaz poskytuje datum ve formátu jako:

    $ exiftool -d "%Y%m%d_%H%M%S"  -CreateDate sample.jpg
    Create Date                     : 20121027_181338
    

    Skutečné datum, které chceme, je čtvrté pole ve výstupu.

  • Předáme exiftool výstup na awk aby mohl extrahovat pole, které chceme:

    awk '{print $4".jpg"}'
    

    Tím se vybere pole data a přidá se také .jpg rozšíř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.


Linux
  1. Seřadit Jpg podle data vytvoření a převést do jednoho PDF?

  2. Jak získat datum/čas vytvoření souboru v Bash/Debian?

  3. Kopírování všech souborů uvnitř podadresářů a přejmenování místo přepisování

  1. Jak najít a seřadit soubory na základě data a času úpravy v Linuxu

  2. Jak udělat Ls a pak seřadit výsledky podle data vytvoření?

  3. Linux – Jak zjistit datum vytvoření souboru?

  1. Získat čas vytvoření/vytvoření souboru??

  2. Změnit datum vytvoření souboru

  3. Příkaz k získání času v milisekundách