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?

  • Is GNU find or GNU stat available? – jordanm Mar 1 '13 at 1:17

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.)

| improve this answer | |
  • Perfect Gilles once I drop cased the .jpg it worked beautifully. Thank you! – Richard Ahlquist Mar 1 '13 at 1:37
  • 1
    I wasn't aware of this date feature, +1. – jordanm Mar 1 '13 at 2:37
  • A shorter date format, same as %Y-%m-%d: date +%F – ingopingo Sep 3 '18 at 16:27

Below is failsafe, because it enters into the directory path and does organization of files inside the directory, only checking if the object to be organized is a file or not.

dir="mention the directory path"; cd "$dir" ; for x in *; do if [ -f "$x" ]; then d=$(date -r "$x" +%Y/%B/%d) && mkdir -p "$d" && mv -- "$x" "$d/"; fi; done
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.