linux脚本用于移动带有数据的目录中的文件

时间:2015-06-25 19:57:47

标签: linux bash shell cron jobs

我正在使用freeradius设备daloradius。 现在有很多路由器连接到这个radius服务器,数据库和日志文件也在增长太多。

freeradius的日志文件保存在:

/radacct/xxx.xxx.xxx.xxx/detail-20150404

xxx.xxx.xxx.xxx是不同的IP客户端,因此这些文件夹中有很多文件夹和大量文件。

我可以添加此目录以旋转日志,因为文件详细信息-TODAY在白天无法修改,并且可以在24小时内访问。

所以我要求:

/radacct/xxx.xxx.xxx.xxx/detail-yyyymmdd移至新文件夹/radacct_old/xxx.xxx.xxx.xxx/detail-yyyymmdd的脚本。

我们必须移动所有之外的文件,其中yyyymmdd是当前日期(执行脚本的日期)。 在此之后,我可以轮换日志radacct_old或只添加到zip radacct_old_yyyymmdd

我打算每周左右做这个工作。

您建议的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

尝试这样的事情:

function move {
    today=$(date +%Y%m%d)
    file="${1#/radacct/}"
    ip="${file%%/*}"
    name="${file##*/}"
    if [[ ! $name =~ detail-$today ]]; then
        dir="/radacct_old/$ip"
        [ -d "${dir}" ] || mkdir "${dir}"            
        mv "${1}" "${dir}/${name}"
    fi
}
export -f move

find /radacct -type d -mindepth 2 -maxdepth 2 -name '*detail*' -exec bash -c 'move "$0"' {} \;

注意这是未经测试的,你一定能填补空白。我会测试它并稍后进行调试,如果你似乎无法使它工作。如果您有其他问题,请发布。

说明:通常脚本会查找所需格式的所有目录,并通过调用函数(开始)移动它们(最后两行)。

移动功能

  • today=$(date +%Y%m%d)以所需格式构建日期。
  • file="${1#/radacct/}"从我们使用find找到的目录中删除前导目录名称。
  • ip="${file%%/*}"提取IP地址。
  • name="${file##*/}"提取目录名称。
  • if [[ ! $name =~ detail-$today ]]; then如果目录名称来自今天。
  • dir="/radacct_old/$ip"构建目标目录。
  • [ -d "${dir}" ] || mkdir "${dir}"如果它不存在则创建它。
  • mv "${1}" "${dir}/${name}"将目录移至新位置。
  • export -f move导出函数,以便在子shell中调用

查找功能

  • find /radacct查看/radacct dir
  • -type d -mindepth 2 -maxdepth 2在dirs中寻找dirs。
  • -name '*detail*',其中包含单词detail。
  • -exec bash -c 'move "$0"' {} \;并执行move函数,提供dir的名称作为参数。

请注意,我会在今天晚些时候添加更多细节并进行测试。

要每周执行此操作,请使用作业。