1

これは私のスクリプトです:

    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

スクリプトを実行すると、次のようになります。

    + 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

これは、このスクリプトがcaseステートメントよりも進んでいないことを明確に示しています。私のケース構成に何か問題がありますか?親切に助けてください。また、スクリプトの全体的な開発に関する提案も歓迎します。

私は次のように私のケース構造で範囲を使用してみました:

    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これも役に立ちません。

4

2 に答える 2

1

各桁を個別にチェックする必要があります。たとえば、ファイルをループする代わりに、必要に応じて親ディレクトリを作成するオプションを使用したり、次を使用して複数の変数を割り当てたり[0-2][0-9]することもできます。findmkdir-pread

#!/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

このスクリプトをフォルダに入れるだけの場合は、時間を確認する必要はありません/etc/cron.hourly。スクリプトは次のようになります。

#!/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" \;
于 2012-12-20T11:17:36.297 に答える
0

これが私の最後のスクリプトです。

    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

少し長いですが、それは私が望んでいたように正確に機能します。皆様のご支援に感謝いたします。

于 2012-12-22T06:57:46.267 に答える