Create sub-directories and organize files by date

I have some directories of files copied from my security camera that I would like to organize into sub-directories by file date. So for example;

-rwxrwxrwx 0 root root 4935241 Jul 19  2012 DSCN1406.JPG
-rwxrwxrwx 0 root root 4232069 Jul 19  2012 DSCN1407.JPG
-rwxrwxrwx 0 root root 5015956 Jul 20  2012 DSCN1408.JPG
-rwxrwxrwx 0 root root 5254877 Jul 21  2012 DSCN1409.JPG

I would like a script that runs to see the files in that directory, then create the 3 needed directories named like;
drwxrwxrwx 1 root root     0 Sep  2 16:49 07-19-2012
drwxrwxrwx 1 root root     0 Sep  2 16:49 07-20-2012
drwxrwxrwx 1 root root     0 Sep  2 16:49 07-21-2012

And then move the files into the appropriate directories. Does anyone have any suggestions on a good scriptable way to accomplish this?


Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

On Linux and Cygwin, you can use date -r to read out the modification date of a file.

for x in *.JPG; do
  d=$(date -r "$x" +%Y-%m-%d)
  mkdir -p "$d"
  mv -- "$x" "$d/"

(I use the unambiguous, standard and easily-sorted YYYY-MM-DD format for dates.)

Method 2

This also checks if the object to be organized is a file or not. This is an important check, failing which a date’s directory can itself get moved into another date. In effect this makes the answer more idempotent, allowing multiple runs.

dir="mention the directory path"
cd "$dir"

for x in *; do
    if [ -f "$x" ]; then
        d=$(date -r "$x" +%Y/%B/%d)
        mkdir -pv "$d"
        mv -v -- "$x" "$d/"

All methods was sourced from or, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Notify of
Inline Feedbacks
View all comments