11

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?

1
  • Is GNU find or GNU stat available? Commented Mar 1, 2013 at 1:17

2 Answers 2

23

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/" done 

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

3
  • Perfect Gilles once I drop cased the .jpg it worked beautifully. Thank you! Commented Mar 1, 2013 at 1:37
  • A shorter date format, same as %Y-%m-%d: date +%F Commented Sep 3, 2018 at 16:27
  • @Acumenus No it won't. The date directories don't match *.JPG. Commented Nov 7, 2020 at 21:44
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/" fi done 

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.