当前位置: 首页 > news >正文

【shell脚本编程】day1 备份指定文件类型

文章目录

    • 1、脚本要求
    • 2、脚本编写
    • 3、脚本解释
    • 4、脚本改进

1、脚本要求

  • 编写一个脚本,遍历/data/目录下的.txt文件
  • 将这些txt文件做一个备份
  • 备份的文件名增加一个年月日的后缀,比如将aming.txt备份为aming.txt_20231001

2、脚本编写

[root@localhost shell]# cat bak.sh 
#!/bin/bashsuffix=`date +%Y%m%d`for f in `find /data/ -type f -name "*.txt"`doecho "备份文件$f"cp ${f}   ${f}_${suffix} 
done
[root@localhost shell]# 

3、脚本解释

这段 Bash 脚本的功能是为/data/目录下全部的.txt文件创建带日期后缀的备份。下面是对代码的详细解释:

获取当前日期:

suffix=`date +%Y%m%d`

借助date命令得到当前日期,并且把格式设定为YYYYMMDD,然后将结果存到变量suffix里。

查找目标文件:

for f in `find /data/ -type f -name "*.txt"`

运用find命令来查找/data/目录下所有类型为文件(-type f)、名字以.txt结尾(-name “*.txt”)的文件。随后,针对每个查找到的文件,都会执行一次循环体。

备份文件:

echo "备份文件$f"
cp ${f}   ${f}_${suffix} 

在循环体中,首先会输出正在备份的文件名称,然后使用cp命令进行文件复制操作。复制时,会在原文件名后面加上_YYYYMMDD这样的日期后缀,以此来创建备份文件。
代码潜在问题
变量引用存在风险:

for f in `find /data/ -type f -name "*.txt"`

要是文件名里包含空格或者特殊字符,这种写法就可能使循环处理文件时出现错误。

缺少错误处理机制:

cp ${f}   ${f}_${suffix} 

当复制过程中出现错误(例如权限不足、磁盘空间不够)时,脚本不会进行任何处理,而是会继续执行后续操作。

未考虑子目录情况:
如果/data/目录下存在子目录,备份文件会和原文件处于同一目录,这样可能会让目录结构变得混乱。

4、脚本改进

#!/bin/bashsuffix=$(date +%Y%m%d)
backup_dir="/data/backup/"# 创建备份目录(如果不存在)
mkdir -p "$backup_dir"# 使用安全的方式查找文件
find /data/ -type f -name "*.txt" -print0 | while IFS= read -r -d '' file; do# 提取文件名和目录filename=$(basename "$file")filedir=$(dirname "$file")# 构建备份文件名backup_file="${backup_dir}/${filename}_${suffix}"echo "备份文件: $file$backup_file"# 执行备份并检查结果if cp "$file" "$backup_file"; thenecho "成功备份: $file"elseecho "备份失败: $file" >&2fi
done
改进内容说明
采用安全的文件处理方式:
运用-print0和read -d ''来处理包含空格的文件名。
借助basename和dirname来分别处理文件名和目录路径。
创建专门的备份目录:
把所有备份文件都存放到/data/backup/目录中,避免原目录结构变得混乱。
添加错误处理:
对cp命令的执行结果进行检查,并且输出相应的成功或失败信息。
使用现代命令替换语法:
把反引号替换成$(...),提升代码的可读性。
http://www.dtcms.com/a/295932.html

相关文章:

  • Unreal5从入门到精通之 动画蓝图 快速入门
  • ML1-ETO 阳性白血病的复发与 LSC 的持续存在密切相关
  • 2025智能BI⼯具竞品深度解析:DataFocus如何挑Tableau与PowerBI的霸主地位?
  • OpenCV图像插值、边缘填充、图像掩膜、噪声消除实战指南
  • 华为仓颉编程语言的表达式的特点
  • 网安学习NO.18
  • 深入掌握CSS Grid布局:每个属性详解与实战示例
  • MySQL 8.4.4详细下载安装配置
  • 【论文阅读】REVISITING DEEP AUDIO-TEXT RETRIEVAL THROUGH THE LENS OF TRANSPORTATION
  • 全面解析 CSS Flex 布局:从入门到精通的所有属性详解
  • DeepSeek-R1+豆包迭代一次完成中国象棋游戏
  • Qwen3-Coder实现中国象棋游戏的尝试
  • Java网络编程入门:从基础原理到实践(二)
  • 计算机网络简答题(大雪圣期末参考资料)
  • Redis哨兵模式(Sentinel)底层实现原理详细介绍
  • Python函数式编程之美:深入理解生成器与高阶函数
  • Product Hunt 每日热榜 | 2025-07-24
  • Java技术栈/面试题合集(17)-Git篇
  • 排序查找算法,Map集合,集合的嵌套,Collections工具类
  • Django实时通信实战:WebSocket与ASGI全解析(上)
  • LAYOUT 什么时候需要等长布线?
  • CodeBuddy IDE发布:编程新时代的颠覆者?
  • Transformer Masked loss原理精讲及其PyTorch逐行实现
  • 【Spring Cloud Gateway 实战系列】高级篇:服务网格集成、安全增强与全链路压测
  • 在 Alpine Linux 中创建虚拟机时 Cgroup 挂在失败的现象
  • spring/springboot SPI(二)配合使用的接口
  • 用 AI 破解数据质量难题:从缺失值填补到动态监控的高效解决方案
  • 数据所有权与用益权分离:数字经济时代的权利博弈与“商业机遇”
  • element-plus 组件 ElMessage、ElLoading 弹框 和加载css 样式展示异常总结
  • 【数学,放缩,基本不等式】基本不等式题目