当前位置: 首页 > 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.lryc.cn/news/598547.html

相关文章:

  • 深入理解大语言模型生成参数:temperature、top\_k、top\_p 等全解析
  • 社区资源媒体管理系统设计与实现
  • 复盘—MySQL触发器实现监听数据表值的变化,对其他数据表做更新
  • Kubernetes Kubelet 资源配置优化指南:从命令行参数到配置文件的最佳实践
  • Hadoop磁盘I/O瓶颈的监控与优化:从iostat指标到JBOD vs RAID的深度解析
  • 40、鸿蒙Harmony Next开发:UI场景化-组件截图(ComponentSnapshot)
  • 跨境支付入门~国际支付结算(结算篇)
  • 龙虎榜——20250724
  • Vue工程化 ElementPlus
  • 数据结构实验-查找与排序算法
  • NPM/Yarn完全指南:前端开发的“基石“与“加速器“
  • 基于单片机智能交通灯设计
  • 人工智能与云计算双轮驱动:元宇宙如何重构全球产业生态
  • Python之底层级的网络接口——Socket(套接字)协议族及函数介绍
  • 【王树森推荐系统】推荐系统涨指标的方法05:特殊用户人群
  • Linux(centos7)安装 docker + ollama+ deepseek-r1:7b + Open WebUI(内含一键安装脚本)
  • 250714脑电分析课题进展——基础知识扩展与论文阅读
  • Android跨进程通信完全教程:从基础到实战
  • 前端笔记:同源策略、跨域问题
  • OpenCV —— 绘制图形
  • git更新内核补丁完整指南
  • 基于Zig语言,opencv相关的c++程序静态交叉编译
  • 常见的Bug管理工具有哪些?(如JIRA、Bugzilla、禅道等)
  • DAY 24 元组和OS模块
  • 【Python机器学习】4.2. 数据分离与混淆矩阵
  • 【XGBoost】两个单任务的模型 MAP - Charting Student Math Misunderstandings
  • 位置编码(position embedding)
  • 前端学习日记(十二)
  • pytest中使用skip跳过某个函数
  • 【Rust线程】Rust高并发编程之线程原理解析与应用实战