linux - 用于在每小时文件夹中移动日志文件的脚本

标签 linux bash shell unix scripting

这是我的脚本:

    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

但这也无济于事。

最佳答案

您需要分别检查每个数字,例如 [0-2][0-9],您也可以使用 find 而不是遍历文件, mkdir-p 选项在必要时创建父目录,并使用 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

如果你只是把这个脚本放在你的 /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" \;

关于linux - 用于在每小时文件夹中移动日志文件的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13968964/

相关文章:

linux - 什么是 Linux 中的长格式?

linux - Neo4j 在 Linux 或 Windows 上更好地工作?

regex - 检查字符串是否可以是 linux 和 windows 上 FS 中的路径

linux - 递归脚本中的目录深度

linux - Bash 脚本在不创建临时文件的情况下保存值

linux - Bash 无法更改文件内容

python - 根据列的数字内容从制表符分隔的文件中删除列?

linux - 将日志文件挂载到其他位置

linux - cURL 命令 - 如何检查网络下载速度

客户端读取另一个文件后没有读取任何数据