Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

linux-shell: renaming files to creation time

Good morning everybody,

for a website I'd like to rename files(pictures) in a folder from "1.jpg, 2.jpg, 3.jpg ..." to "yyyymmdd_hhmmss.jpg" - so I'd like to read out the creation times an set this times as names for the pics. Does anybody have an idea how to do that for example with a linux-shell or with imagemagick?

Thank you!

like image 776
Andre Avatar asked Aug 06 '14 05:08

Andre


People also ask

Does rename change timestamp?

It will not change the timestamp of the renamed folder but it will change the timestamp of the parent directory.

Can you automate renaming files?

To batch rename files, just select all the files you want to rename, press F2 (alternatively, right-click and select rename), then enter the name you want on the first file. Press Enter to change the names for all other selected files.


1 Answers

Naming based on file system date

In the linux shell:

for f in *.jpg do     mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg" done 

Explanation:

  • for f in *.jpg do

    This starts the loop over all jpeg files. A feature of this is that it will work with all file names, even ones with spaces, tabs or other difficult characters in the names.

  • mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"

    This renames the file. It uses the -r option which tells date to display the date of the file rather than the current date. The specification +"%Y%m%d_%H%M%S" tells date to format it as you specified.

    The file name, $f, is placed in double quotes where ever it is used. This assures that odd file names will not cause errors.

    The -n option to mv tells move never to overwrite an existing file.

  • done

    This completes the loop.

For interactive use, you may prefer that the command is all on one line. In that case, use:

for f in *.jpg; do mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"; done 

Naming based on EXIF Create Date

To name the file based on the EXIF Create Date (instead of the file system date), we need exiftool or equivalent:

for f in *.jpg do     mv -n "$f" "$(exiftool -d "%Y%m%d_%H%M%S" -CreateDate "$f" | awk '{print $4".jpg"}')" done 

Explanation:

The above is quite similar to the commands for the file date but with the use of exiftool and awk to extract the EXIF image Create Date.

  • The exiftool command provides the date in a format like:

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

    The actual date that we want is the fourth field in the output.

  • We pass the exiftool output to awk so that it can extract the field that we want:

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

    This selects the date field and also adds on the .jpg extension.

like image 79
John1024 Avatar answered Sep 20 '22 23:09

John1024