在工作中,我们经常遇到要从Linux服务器拷贝日志至本地或者定期清理日志的需求,在服务器上,大型系统的日志是按模块存储的,这就导致日志的文件目录较多且层级不统一。我们从众多的目录手工筛选要下载或者删除的文件就非常耗时且low。对于这种需求,我研究了一下shell脚本的实现,现将可用的shell脚本分享如下:

1、模拟多层级logs环境

[root@localhost ~]# cd /home/
[root@localhost ~]# mkdir -p logs/fo
[root@localhost ~]# mkdir -p logs/fc/2022-02-31
[root@localhost ~]# mkdir -p logs/gl
[root@localhost ~]# mkdir -p logs/gt
[root@localhost ~]# touch logs/all.log
[root@localhost ~]# touch logs/error.log
[root@localhost ~]# touch logs/info.log
[root@localhost ~]# touch logs/gt/all.log
[root@localhost ~]# touch logs/gt/error.log
[root@localhost ~]# touch logs/gt/info.log
[root@localhost ~]# touch logs/gl/all.log
[root@localhost ~]# touch logs/gl/error.log
[root@localhost ~]# touch logs/gl/info.log
[root@localhost ~]# touch logs/fo/all.log
[root@localhost ~]# touch logs/fo/error.log
[root@localhost ~]# touch logs/fo/info.log
[root@localhost ~]# touch logs/fc/all.log
[root@localhost ~]# touch logs/fc/error.log
[root@localhost ~]# touch logs/fc/info.log
[root@localhost ~]# touch logs/fc/2022-02-31/all.log
[root@localhost ~]# touch logs/fc/2022-02-31/error.log
[root@localhost ~]# touch logs/fc/2022-02-31/info.log
  • 方便期间, 编写一个脚本来创建
cd /home/
mkdir -p logs/fo
mkdir -p logs/fc/2022-02-31
mkdir -p logs/gl
mkdir -p logs/gt
touch logs/all.log
touch logs/error.log
touch logs/info.log
touch logs/gt/all.log
touch logs/gt/error.log
touch logs/gt/info.log
touch logs/gl/all.log
touch logs/gl/error.log
touch logs/gl/info.log
touch logs/fo/all.log
touch logs/fo/error.log
touch logs/fo/info.log
touch logs/fc/all.log
touch logs/fc/error.log
touch logs/fc/info.log
touch logs/fc/2022-02-31/all.log
touch logs/fc/2022-02-31/error.log
touch logs/fc/2022-02-31/info.log
  • 环境结构如下图

2、以拷贝文件为例,脚本解析

  • -maxdepth 1 文件目录级次,1代表当前目录
  • -mtime -5 修改日期
    • -mtime n 按照文件的更改时间来找文件,n为整数。
    • n 表示文件更改时间距离为n天
    • -n 表示文件更改时间距离在n天以内
    • +n 表示文件更改时间距离在n天以前
  • -type f 查找文件而非文件夹
#/bin/bash
# 日志存储路径
logsname=/home
# 日志筛选后存放的路径
newdir=/data
# 基于日志存储路径(logsname)的日志存放路径
logname=logs
# 进入到日志存储路径下
cd $logsname
# 目录重建函数,与原日志存储路径一致,只不过上层路径发生了变化
function mkdir_fun(){
## 判断文件夹是否不存在(! 代表取反)
if [ ! -d $newdir"/"$1"/"$dirname ]
then
mkdir -p $newdir"/"$dirname #在新的路径下创建日志目录
else
echo $newdir"/"$dirname"已存在!"
fi
cpfile_fun $dirname $newdir # 调用文件拷贝函数
}
# 文件拷贝函数
function cpfile_fun(){
# 查找 $dirname 当前目录下,5天内修改的文件,查到后拷贝到新建的目录中
find $dirname -maxdepth 1 -mtime -5 -type f | xargs -i cp {} $newdir"/"$dirname
}
# 循环遍历日志
function read_dir(){
for dirname in `find $logname -type d -mtime -5`
do
if [ -d $1"/"$dirname ]
then
read_dir $1"/"$dirname
else
echo "1_"$dirname
mkdir_fun $dirname
#cpfile_fun $dirname
fi
done
}
# 调用循环遍历日志函数
read_dir
  • 执行前

  • 执行后

Linux文件拷贝脚本的更多相关文章

  1. Linux文件拷贝(6)

    本篇介绍文件拷贝操作,主要讲两个命令: 命令 对应英文 作用 tree[目录名] tree 以树状图列出文件目录结构 cp 源文件 目标文件 copy 复制文件或者目录 tree tree命令可以将一 ...

  2. 【转】嵌入式Linux文件系统启动脚本及分析

    原文网址:http://www.linuxidc.com/Linux/2011-03/33728.htm 在内核初始化完成后,嵌入式linux 文件系统的启动过程主要包含以下几个步骤: 1. 执行/s ...

  3. linux文件分发脚本

    1.说明 此脚本可分发两类文件,1.固定内容文件,2.(每台被分发主机)内容不同的文件 ppp.sh为拨号脚本,每台被分发主机内容不同 根据分发文件名字不同(ppp.sh和其他文件)自动选择分发方式 ...

  4. linux文件归档脚本

    #!/bin/bash range= dir="/app/xx/logs" bak_dir="/app/xx/logs_archive" cd $dir $ra ...

  5. 将文件从一台linux机器拷贝到多台的方法

    首先你所操作的各台linux机器间必须设置了ssh免密码登录,具体方法可上网查看.将文件从一台linux机器拷贝到多台分为以下几个步骤: 第一步:创建脚本文件remotecopy.sh #!/bin/ ...

  6. linux下shell脚本执行jar文件

    最近在搞一个shell脚本启动jar文件个关闭jar文件的东东.搞得我都蛋疼了.今天晚上终于弄好了 话说,小弟的linux只是刚入门,经过各方查资料终于搞定了.话不多说,下面开始上小弟写的shell脚 ...

  7. Linux系统下远程文件拷贝scp命令

    在Linux系统下,不同机器上实现文件拷贝 一.将本地文件拷贝到远程机器: scp /home/administrator/news.txt root@192.168.6.129:/etc/squid ...

  8. windows python文件拷贝到linux上执行问题

    之前在Windows下写好了一个Python脚本,运行没问题,今天在Linux下,脚本开头的注释行已经指明了解释器的路径,也用chmod给了执行权限,但就是不能直接运行脚本. 1 问题1: 报错:: ...

  9. linux执行sh脚本文件命令

    linux执行sh脚本文件命令 很多时候需要多个命令来完成一项工作,而这个工作又常常是重复的,这个时候我们自然会想到将这些命令写成sh脚本,下次执行下这个脚本一切就都搞定了,下面就是发布代码的一个脚本 ...

随机推荐

  1. flex布局图片和文字同级,文字过多导致图片变形问题

    图片增加css样式即可 flex-grow: 0;flex-shrink: 0;

  2. Quartz 使用记录

    Quartz 使用记录 官网 https://www.quartz-scheduler.org/ 参考文档 Quartz 2.3.0 什么是 Quartz? 官方描述: Quartz is a ric ...

  3. librttopo 安装

    librttopo 安装 官网 下载地址 https://git.osgeo.org/gitea/rttopo/librttopo/tags 什么是 librttopo? The RT Topolog ...

  4. 用于激光雷达的 APD,SPAD 和 SiPM 分析

    1. 术语及定义 1.1 激光雷达,Light Detection And Range, LiDAR  发射激光光束,并接收回波以获取目标三维和/或速度信息的系统: 1.2 机械旋转激光雷达,Mech ...

  5. 聊聊Lock接口的lock()和lockInterruptible()有什么区别?

    lock()和lockInterruptible()都表示获取锁,唯一区别是,当A线程调用lock()或lockInterruptible()方法获取锁没有成功而进入等待锁的状态时,若接着调用该A线程 ...

  6. Java实用类

    //String类常用方法 public int length()//获取String对象的字符序列的长度 n=s.length(); public boolean equals(String s)/ ...

  7. Linux网卡绑定bond0-实验

    虚拟机添加网卡 ip addr 查看新增的网卡是否读取 添加bonding接口 [root@centos8~]$nmcli con add type bond con-name mybond0 ifn ...

  8. 【Python爬虫案例】用Python爬取李子柒B站视频数据

    一.视频数据结果 今天是2021.12.7号,前几天用python爬取了李子柒的油管评论并做了数据分析,可移步至: https://www.cnblogs.com/mashukui/p/1622025 ...

  9. python操作MySQL、事务、SQL注入问题

    python操作MySQL python中支持操作MySQl的模块很多 其中最常见就是'pymysql' # 属于第三方模块 pip3 install pymysql # 基本使用 import py ...

  10. 防火墙之ipset表应用

    简介 由于公司线上生产环境firewalld默认都是关闭的,所以只能依赖iptables的表来方便管理IP黑白名单. 提示线上生产环境不要随便重启iptables,会导致docker已经映射好的关系表 ...