1

This is my script :

    set -x

    PTH=/data0101/track_logs
    cd /data0101/track_logs

    if [[ `ls -lrth | grep IMEI_TRACK | wc -l` -gt 0 ]];
    then
       FILE_COUNT=`ls -lrth | grep IMEI_TRACK | wc -l`

       YEAR=`date | awk '{print $6}'`
       mkdir $PTH/$YEAR

       MONTH=`date | awk '{print $2}'`
       mkdir $PTH/$YEAR/$MONTH

       DAY=`date | awk '{print $3}'`

       HOUR=`date | awk '{print $4}' | cut -d":" -f 1`
       if [[ $HOUR -ne 0 ]];
       then
          HR=$(( $HOUR - 1 ))
       else
          DAY=$(( $DAY - 1 ))
          HR=23
          mkdir $PTH/$YEAR/$MONTH/$DAY
       fi
       case $HR  in
            00-23) for (( i=1;i<=$FILE_COUNT;i++ ))
                   do
                    chk=`ls -lrth | grep IMEI_TRACK | head -$i | tail -1 | awk '{print    $8}' | cut -d: -f1`
                    FILE=`ls -lrth | grep IMEI_TRACK |  awk '{print $9}'`
                    if [[ $chk -eq $HR ]];
                    then
                       mkdir $PTH/$YEAR/$MONTH/$DAY/$HR
                       mv $FILE $PTH/$YEAR/$MONTH/$DAY/$HR/
                    else
                       break
                    fi
                   done ;;


       esac
    fi

When I run the script this is what I get:

    + PTH=/data0101/track_logs
    + cd /data0101/track_logs
    ++ ls -lrth
    ++ grep IMEI_TRACK
    ++ wc -l
    + [[ 200 -gt 0 ]]
    ++ ls -lrth
    ++ grep IMEI_TRACK
    ++ wc -l
    + FILE_COUNT=200
    ++ date
    ++ awk '{print $6}'
    + YEAR=2012
    + mkdir /data0101/track_logs/2012
    mkdir: cannot create directory `/data0101/track_logs/2012': File exists
    ++ date
    ++ awk '{print $2}'
    + MONTH=Dec
    + mkdir /data0101/track_logs/2012/Dec
    mkdir: cannot create directory `/data0101/track_logs/2012/Dec': File exists
    ++ date
    ++ awk '{print $3}'
    + DAY=20
    ++ date
    ++ awk '{print $4}'
    ++ cut -d: -f 1
    + HOUR=14
    + [[ 14 -ne 0 ]]
    + HR=13
    + case $HR in

This clearly shows that this script is not getting further than the case statement. Is there anything wrong with my case construct. Kindly help. Also suggestions on overall development of the script is also welcome.

I tried using the range in my case construct like this:

    case $HR  in
                [00-23]) for (( i=1;i<=$FILE_COUNT;i++ ))
                           do
                            chk=`ls -lrth | grep IMEI_TRACK | head -$i | tail -1 | awk '{print    $8}' | cut -d: -f1`
                            FILE=`ls -lrth | grep IMEI_TRACK |  awk '{print $9}'`
                            if [[ $chk -eq $HR ]];
                            then
                               mkdir $PTH/$YEAR/$MONTH/$DAY/$HR
                               mv $FILE $PTH/$YEAR/$MONTH/$DAY/$HR/
                            else
                               break
                            fi
                           done ;;


      esac

bu this doesn't help as well.

dig_123
  • 2,240
  • 6
  • 35
  • 59
  • Only one value for HR is checked: this is `00-23`. This does not represent a range. See [regular expression in bash case statement](http://stackoverflow.com/q/9631335/45249) question for hints. – mouviciel Dec 20 '12 at 09:35

2 Answers2

1

You need to check each digit separate, something like [0-2][0-9], you can also use find instead of looping over the files, mkdir with -p option to create parent directories if necessary, and multiple variable assignment using read:

#!/bin/bash

PTH="/data0101/track_logs"
cd "$PTH"

if [[ $(ls -lrth | grep IMEI_TRACK | wc -l) -gt 0 ]]; then
    DATE=$(date +"%Y %m %d %H")
    DIR=${DATE// /\/}
    read YEAR MONTH DAY HOUR <<<$DATE

    case $HOUR  in
        [0-2][0-9]) mkdir -p "$DIR"
                    find ./ -mtime -1 -name "*IMEI_TRACK*" -type f -exec mv "{}" "$DIR" \;;;

    esac
fi

You don't need to check the hour if you just put this script in your /etc/cron.hourly folder, then your script would look something like this:

#!/bin/bash

PTH="/data0101/track_logs"
cd "$PTH"

DIR=$(date +"%Y/%m/%d/%H")
mkdir "$DIR"

find ./ -mtime -1 -name "*IMEI_TRACK*" -type f -exec mv "{}" "$DIR" \;
  • you might also want the 1 liner version `cd "/data0101/track_logs" && mkdir -p $(date +"%Y/%m/%d/%H") && find ./ -mtime -1 -name "*IMEI_TRACK*" -type f -exec mv "{}" "$_" \;` –  Dec 20 '12 at 11:39
0

This is my final script:

    cd /data0101/track_logs

    if [[ `ls -lrth | grep IMEI_TRACK | wc -l` -gt 0 ]];
    then
       FILE_COUNT=`ls -lrth | grep IMEI_TRACK | wc -l`
       YEAR=`date | awk '{print $6}'`
       MONTH=`date | awk '{print $2}'`
       DAY=`date | awk '{print $3}'`
       HOUR=`date | awk '{print $4}' | cut -d":" -f 1`
       if [[ "$HOUR" -ne 0 ]];
       then
          HR=$(( $HOUR - 1 ))
       else
          DAY=$(( $DAY - 1 ))
          HR=23
       fi

       case $HR in
                 [0-9]) for (( i=1;i<=$FILE_COUNT;i++ ))
                          do
                           chk_hr=`ls -lrth | grep IMEI_TRACK | head -$i | tail -1 | awk '{print $8}' | cut -d: -f1`
                           chk_day=`ls -lrth | grep IMEI_TRACK | head -$i | tail -1 | awk '{print $7}'`
                           FILE=`ls -lrth | grep IMEI_TRACK | head -$i | tail -1 |  awk '{print $9}'`
                           if [[ $chk_hr -eq $HR && $chk_day -eq $DAY ]];
                           then
                              mkdir -p $DIR_PATH/$YEAR/$MONTH/$DAY/$HR
                              mv $FILE $DIR_PATH/$YEAR/$MONTH/$DAY/$HR/
                           fi
                          done ;;
                 [1-2][0-9]) for (( i=1;i<=$FILE_COUNT;i++ ))
                               do
                                chk_hr=`ls -lrth | grep IMEI_TRACK | head -$i | tail -1 | awk '{print $8}' | cut -d: -f1`
                                chk_day=`ls -lrth | grep IMEI_TRACK | head -$i | tail -1 | awk '{print $7}'`
                                FILE=`ls -lrth | grep IMEI_TRACK |  head -$i | tail -1 | awk '{print $9}'`
                                if [[ $chk_hr -eq $HR && $chk_day -eq $DAY ]];
                                then
                                   mkdir -p $DIR_PATH/$YEAR/$MONTH/$DAY/$HR
                                   mv $FILE $DIR_PATH/$YEAR/$MONTH/$DAY/$HR/
                                fi
                               done ;;
        esac
    fi
enter code here

Though little lengthy, but its working exactly the way I wanted. Thanks all for your support.

dig_123
  • 2,240
  • 6
  • 35
  • 59