在工作中,我们经常遇到要从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. EMS批量为用户分配邮箱

    组织单位"Office"下有10个域用户,可以通过PowerShell命令一次为该组织单位中的没有分配邮箱的域用户分配邮箱. 以Exchange管理员身份打开EMS控制台.在Pow ...

  2. 网络编程学习——Linux epoll多路复用模型

    前言 后端开发的应该都知道Nginx服务器,Nginx是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器.后端部署中一般使用的就是Nginx反向代理技术. ...

  3. MySQL 的发展历史和版本分支

    时间和里程碑 想查看之前的版本可以从这里找到mysql4,5,8等版本http://mirrors.sohu.com/mysql/下面简单回顾下相关的一些版本信息1996 年 MySQL 1.0 发布 ...

  4. Spring Framework 学习笔记——核心技术之Spring IOC

    Spring Framework 官网文档学习笔记--核心技术之Spring IOC 官方文档 spring-framework-5.3.9 1. Spring Framework 核心技术 1.1 ...

  5. 如何在 Java 中实现 Dijkstra 最短路算法

    定义 最短路问题的定义为:设 \(G=(V,E)\) 为连通图,图中各边 \((v_i,v_j)\) 有权 \(l_{ij}\) (\(l_{ij}=\infty\) 表示 \(v_i,v_j\) 间 ...

  6. QT-进制转换计算器

    适合初学者练手 用QT做的一个进制转换工具,主要涉及数据类型转换.//后面再加上基本的计算. Github地址:https://github.com/wsdassssss/Calculate.git ...

  7. 使用 Nginx 实现 URL 的重定向

    1. 概述 老话说的好:取乎上,得其中:取乎中,得其下.因此我们不妨把目标定的高一些,去努力,才能得到更好回报. 言归正传,今天我们来聊聊 使用 Nginx 实现 URL 的重定向. 2. 使用 Ng ...

  8. c#中判断类是否继承于泛型基类

    在c#中,有时候我们会编写类似这样的代码: public class a<T> { //具体类的实现 } public class b : a<string>{} 如果b继承a ...

  9. GET sql注入

    靶机地址:192.168.43.156 攻击机地址:192.168.43.89 一.AppScan检查靶机sql漏洞 二.使用sqlmap利用SQL注入漏洞 1.sqlmap -u " ht ...

  10. Mysql、Oracle锁表处理

    MySql解锁方式 1 # 1. 查看当前数据库锁表的情况 2 SELECT * FROM information_schema.INNODB_TRX; 3 # 2. 杀掉查询结果中锁表的trx_my ...