Visit The New, Modern Unix Linux Community


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

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #400
Difficulty: Medium
The first release for HP 9000 Series 500 HP-UX for Series 500 was HP-UX 1.0 (1982).
True or False?

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

Featured Tech Videos