Move files based on date in filename


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Move files based on date in filename
# 1  
Old 06-25-2010
Move files based on date in filename

I know this gets covered quite a bit in the forum and I think there is enough there for me to figure out how to do what I am trying to do, I just don't think I would do it very efficiently so I am going to ask the question...

I have database log files with date and time stamps in the file like
db2diag-2010-04-09-06.04.01.log in a directory in AIX

I want to process this directory of log files and where the date stamp in the file name is greater than 30 days old (I have roughly 6 months worth now) I want to move that file to another path and put it into the appropriate folder based on date where the naming is month-year format (like Apr-2010).

There's probably a thousand ways to think about this and I can only see the one right at the top of my mind, but I am guessing I need a loop where I parse the date out of each file name with pattern db2diag*.log, see if it's more than 30 days old and then use that date to figure out the name of the folder it needs to move to. I think with my knowledge level I'd probably be tempted to do that with a case statement so that when I parse the 04 out of the example file name I do something like (where $month equals 04)


Code:
case "$month" in 
1) month=Jan;
;;
2) month=Feb;
;;
3) month=Mar;
;;
4) month=Apr;
;;

.
.
.

ideas?
# 2  
Old 06-25-2010
How about ...

Code:
#!/bin/bash

for FILE in $( ls db2diag*.log )
do
  FOLDER=$( echo $FILE | awk -F '-' '{print $2"_"$3}' )
  if [ ! -d $FOLDER ]
  then
    mkdir -v $FOLDER
  fi
  mv -v $FILE $FOLDER
done

exit 0
# finis

Code:
[house@leonov] ls db*
db2diag-2010-04-09-06.04.01.log  
db2diag-2010-04-10-06.04.01.log  
db2diag-2010-05-10-06.04.01.log
[house@leonov] bash code.bash
mkdir: created directory `2010_04'
`db2diag-2010-04-09-06.04.01.log' -> `2010_04/db2diag-2010-04-09-06.04.01.log'
`db2diag-2010-04-10-06.04.01.log' -> `2010_04/db2diag-2010-04-10-06.04.01.log'
mkdir: created directory `2010_05'
`db2diag-2010-05-10-06.04.01.log' -> `2010_05/db2diag-2010-05-10-06.04.01.log'
[house@leonov] lr 2010*
2010_04:
db2diag-2010-04-09-06.04.01.log
db2diag-2010-04-10-06.04.01.log
2010_05:
db2diag-2010-05-10-06.04.01.log

# 3  
Old 06-25-2010
Thank you. I'm going to play with this a little and see if I get it tuned to what I need. The month-year (Apr-2010) folders that I am moving to already exist which is why I need to figure out from my file name that *2010-04-09 should go into the Apr-2010 folder as opposed to making a new one. I like your loop logic though so I'm gonna borrow that and see if I can get there. I'll let you know.
# 4  
Old 06-25-2010
Quote:
Originally Posted by slatoms
The month-year (Apr-2010) folders that I am moving to already exist which is why I need to figure out from my file name that *2010-04-09 should go into the Apr-2010 folder as opposed to making a new one.
No problem Smilie

Code:
YEAR=$( echo $FILE | awk -F '-' '{print $2}' )
MONTH=$( echo $FILE | awk -F '-' '{print $3}' )
case $MONTH in
  "01") MONTH='JAN' ;;
  # etc. etc.
  "04") MONTH='APR' ;;
  # etc. etc.
esac
FOLDER=$MONTH"-"$YEAR

This User Gave Thanks to dr.house For This Post:
# 5  
Old 06-25-2010
Okay.... Thank you...actually that's the direction I going in, I just felt like maybe that was too much overhead to do that case compare with each file in the loop. I was thinking there might be a simpler way. Here's what I was going to send back to you...

Code:
for FILE in $( ls $instance_hpath/db2dump/db2diag*.log )
do
   FMONTH=$( echo $FILE | awk -F '-' '{print $3}' )
   FYEAR=$( echo $FILE | awk -F '-' '{print $2}' )
   case "$FMONTH" in 
   01) FMONTH=Jan;
   ;;
   02) FMONTH=Feb;
   ;;
   03) FMONTH=Mar;
   ;;
   04) FMONTH=Apr;
   ;;
   05) FMONTH=May;
   ;;
   06) FMONTH=Jun;
   ;;
   07) FMONTH=Jul;
   ;;
   08) FMONTH=Aug;
   ;;
   09) FMONTH=Sep;
   ;;
   10) FMONTH=Oct;
   ;; 
   11) FMONTH=Nov;
   ;;
   12) FMONTH=Dec;
   ;;
   esac
   FOLDER=$FMONTH'_'$FYEAR
   echo $FOLDER
.
.
.
(you'd do your move now)



---------- Post updated at 02:49 PM ---------- Previous update was at 02:45 PM ----------

(Oh...and I still have to work in my ***Only do this is the file is more than 30 days old*** logic. I'm guessing I should do an IF statement right up front and make all the rest of this the THEN if the file is > 30 days)
# 6  
Old 06-25-2010
Code:
LIST=$( find $instance_hpath/db2dump -name "db2diag*.log" -mtime +30 -print )
for FILE in $LIST
do
  FYEAR=$( echo $FILE | awk -F '-' '{print $2}' )
  FMONTH=$( echo $FILE | awk -F '-' '{print $3}' )
  case $FMONTH in 
    "01") FMONTH=Jan ;;
    "02") FMONTH=Feb ;;
    "03") FMONTH=Mar ;;
    "04") FMONTH=Apr ;;
    "05") FMONTH=May ;;
    "06") FMONTH=Jun ;;
    "07") FMONTH=Jul ;;
    "08") FMONTH=Aug ;;
    "09") FMONTH=Sep ;;
    "10") FMONTH=Oct ;; 
    "11") FMONTH=Nov ;;
    "12") FMONTH=Dec ;;
  esac
  FOLDER=$FMONTH'_'$FYEAR
  mv -v $FILE $FOLDER
done


# 7  
Old 06-25-2010
My goal is to move all but about the current month's worth of files so I ended up trying this...

Code:
for FILE in $( ls $instance_hpath/db2dump/db2diag*.log )
do
   FMONTH=$( echo $FILE | awk -F '-' '{print $3}' )
   FYEAR=$( echo $FILE | awk -F '-' '{print $2}' )
   case "$FMONTH" in
   01) FMONTH=Jan;
   ;;
   02) FMONTH=Feb;
   ;;
   03) FMONTH=Mar;
   ;;
   04) FMONTH=Apr;
   ;;
   05) FMONTH=May;
   ;;
   06) FMONTH=Jun;
   ;;
   07) FMONTH=Jul;
   ;;
   08) FMONTH=Aug;
   ;;
   09) FMONTH=Sep;
   ;;
   10) FMONTH=Oct;
   ;;
   11) FMONTH=Nov;
   ;;
   12) FMONTH=Dec;
   ;;
   esac
   if [ $FMONTH != $(date +\%b) ]
   then
   FOLDER=$FMONTH'_'$FYEAR
   echo $FOLDER
   fi 
done

Your approach may be better since it pulls out all the eligible files before the looping starts. Thank you again.
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Move files from one directory to another based on creation/modification date

Hi All, Really stuck up with a requirement where I need to move a file (Lets say date_Employee.txt--the date will have different date values like 20120612/20120613 etc) from one directory to another based on creation/modification dates. While visiting couple of posts, i could see we can... (3 Replies)
Discussion started by: dsfreddie
3 Replies

2. UNIX for Dummies Questions & Answers

Move txt file to with current date appended to filename

I have multiple txt files which begin with the word "orders" in folder C:\source. I need to move the files to folder C:\dest and rename them to "process_<date>_<count>" So for example , if there are 3 files ordersa.txt , ordersb.txt and ordersc.txt in C:\source , after running the script I want... (7 Replies)
Discussion started by: johannd
7 Replies

3. Shell Programming and Scripting

Move txt file to with current date appended to filename

I have multiple txt files which begin with the word "orders" in folder C:\source. I need to move the files to folder C:\dest and rename them to "process_<date>_<count>" So for example , if there are 3 files ordersa.txt , ordersb.txt and ordersc.txt in C:\source , after running the script I want... (1 Reply)
Discussion started by: johannd
1 Replies

4. Shell Programming and Scripting

Move all files from source to destination directory based on the filename

Move all files starting with a specific name to different directory. This shell script program should have three parameters File Name Source Directory Destination Directory User should be able to enter ĎAB_CD*' in file name parameter. In this case all the files starting with AB_CD will... (1 Reply)
Discussion started by: chetancrsp18
1 Replies

5. Shell Programming and Scripting

Get the oldest date based on date in the filename

I am using ksh93 on Solaris. Ok, this may seem like a simple request at first. I have a directory that contains sets of files with a YYYYMMDD component to the name, along with other files of different filespecs. something like this: 20110501_1.dat 20110501_2.dat 20110501_3.dat... (2 Replies)
Discussion started by: gary_w
2 Replies

6. Shell Programming and Scripting

Move file based on filename

Hi All I need a script to manipulate files based on a filename: example filename: 66600_042706.pdf the script will create a directory 66000 only if this directory is not existing. If that directory is existing it will just move the file to 66000/666000_042706.pdf in addition, i want to... (4 Replies)
Discussion started by: aemestech
4 Replies

7. Shell Programming and Scripting

want to move files in a dir into different directories based on the filename

I want to move the files in a dir to different dirs based on their file names. Ex: i have 4 different files with name - CTS_NONE_10476031_MRL_PFT20081215a.txt CTS_NONE_10633009_MRL_PFT20091020a.txt CTS_NONE_10345673_MRL_PFT20081215a.txt CTS_NONE_10872456_MRL_PFT20091020a.txt and the 1st... (4 Replies)
Discussion started by: Sriranga
4 Replies

8. UNIX for Dummies Questions & Answers

want to move files in a dir into different directories based on the filename

I want to move the files in a dir to different dirs based on their file names. Ex: i have 4 different files with name - CTS_NONE_10476031_MRL_PFT20081215a.txt CTS_NONE_10633009_MRL_PFT20091020a.txt CTS_NONE_10345673_MRL_PFT20081215a.txt CTS_NONE_10872456_MRL_PFT20091020a.txt and the 1st... (2 Replies)
Discussion started by: Sriranga
2 Replies

9. UNIX for Dummies Questions & Answers

how to move files into different folders based on filename

I need to move a bunch of files into folders that have the same name. I wanted to either do this with some filter command or some type of batch file that I could save that would already include all of the mv commands since I will have to do this process often. Whatever method you think is easier. ... (7 Replies)
Discussion started by: italia5
7 Replies
Login or Register to Ask a Question

Featured Tech Videos