Quick script to organize files in directories by date

Let's say you have a bunch of files in a single directory you'd like to organize them in directories by date. Here's one way to do it using a shell script.

For example, create some files:

touch file0
touch -d "yesterday" file1
touch -d "2 days ago" file2
touch -d "2 days ago" file3

I now have four files in the current directory:

$ find -type f | xargs ls -l --time-style long-iso
-rw-rw-r-- 1 ak ak 0 2013-04-13 14:30 ./file0
-rw-rw-r-- 1 ak ak 0 2013-04-12 14:30 ./file1
-rw-rw-r-- 1 ak ak 0 2013-04-11 14:30 ./file2
-rw-rw-r-- 1 ak ak 0 2013-04-11 14:30 ./file3

Time to get organized!

OrganizeByDate
processing 2013-04-11..
creating dir 2013-04-11..
moving file2 to 2013-04-11/
moving file3 to 2013-04-11/
processing 2013-04-12..
creating dir 2013-04-12..
moving file1 to 2013-04-12/
processing 2013-04-13..
creating dir 2013-04-13..
moving file0 to 2013-04-13/

Now, each of the four files is in a directory named after its creation date:

find -type f | xargs ls -l --time-style long-iso
-rw-rw-r-- 1 ak ak 0 2013-04-11 14:30 ./2013-04-11/file2
-rw-rw-r-- 1 ak ak 0 2013-04-11 14:30 ./2013-04-11/file3
-rw-rw-r-- 1 ak ak 0 2013-04-12 14:30 ./2013-04-12/file1
-rw-rw-r-- 1 ak ak 0 2013-04-13 14:30 ./2013-04-13/file0

And here's the script:

OrganizeByDate()
{
  all=$(ls -l --time-style long-iso | awk '$1!~/^d/ {print $6"|"$8}')
  for date in $(echo "$all" | awk -F'|' '$1!="" {print$1}' | sort -u); do
    echo processing $date..
    if [ ! -d $date ]; then
      echo creating dir $date..
      mkdir $date
    fi
    echo "$all" | grep "^$date" | cut -d'|' -f2 |
    while read f; do
      echo moving $f to $date/
      mv $f $date/
    done
  done
}

Leave a comment

NOTE: Enclose quotes in <blockquote></blockquote>. Enclose code in <pre lang="LANG"></pre> (where LANG is one of these).