文章目录

    • 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.pswp.cn/web/90356.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90356.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90356.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gata 携手 Walrus 构建 AI 的开放执行基础设施

致力于开发去中心化大模型推理、训练和数据技术的 Gata,现已整合 Walrus,作为其 AI 开放执行基础设施的核心组件。Walrus 将为 Gata 的首款产品 DataAgent 提供关键的数据层,助力其全套应用,将去中心化 AI 的优势直接带给用户&…

DNS及DNS域名解析流程

文章目录什么是DNS域名解析DNS服务器DNS域名解析流程什么是DNS域名解析 我们首先要了解域名和IP地址的区别。IP地址是互联网上计算机唯一的逻辑地址,通过IP地址实现不同计算机之间的相互通信,每台联网计算机都需要通过IP地址来互相联系和分别。 但由于I…

用 STM32 的 SYSTICK 定时器与端口复用重映射玩转嵌入式开发

目录 1. SYSTICK 定时器的基本功:时间管理大师 1.1 SYSTICK 的核心寄存器与工作原理 1.2 配置 SYSTICK 的正确姿势 1.3 实战:用 SYSTICK 实现精准延时 1.4 小技巧:SYSTICK 的低功耗优化 2. SYSTICK 中断:让你的程序“活”起来 2.1 配置 SYSTICK 中断 2.2 实战:用 S…

Sa-Token:轻量级Java权限认证框架使用指南

一、Sa-Token简介 Sa-Token 是一个专注于权限认证的轻量级 Java 框架,旨在简化登录认证、权限控制等功能的实现。其核心功能包括: 登录认证:通过 Token 机制管理用户会话,支持单点登录(SSO)。权限认证&am…

动态 vs 静态住宅代理,哪种更适合广告投手?

在广告投放行业,无论你是跑Facebook、Google Ads,还是做TikTok、原生广告,代理IP几乎是绕不开的话题。而选择动态住宅代理还是静态住宅代理,对广告账户的稳定性、投放质量甚至生命周期都有直接影响。本篇文章将结合IPFoxy代理&…

命题是一种清晰、确定的表达。通过学习命题,来帮助你更清晰地表达自己的思想。

文章目录 引言 I 命题的特点 可以判断真伪 同一性 II 有效沟通的小技巧 多用陈述句,少用感叹句和疑问句。 在表述意思时,多用名词,少用代词;多用具体的名词,少用抽象的名词,避免造成不必要的歧义。 正确找托词 引言 要进行有效的逻辑推理,第一步是把我们的想法,我们要…

IPV6地址与IPV4有什么区别?

作为互联网协议的迭代版本,IPV6(Internet Protocol Version 6)与IPV4(Internet Protocol Version 4)在设计理念和功能特性上存在显著差异。本文将简要解析两者的核心区别,帮助读者理解IPV6的优势与必要性。…

python 什么时候应该用函数式编程,什么时候应该用面向对象?

在 Python 这个多范式语言中,选择使用函数式编程(Functional Programming, FP)还是面向对象编程(OOP)并非一个非黑即白的选择,而更像是在一个工具箱中为特定的任务挑选最合适的工具。 我们可以用一个比喻来…

【设计模式】迭代器模式 (游标(Cursor)模式)

迭代器模式(Iterator Pattern)详解一、迭代器模式简介 迭代器模式(Iterator Pattern) 是一种 行为型设计模式(对象行为型模式),它提供了一种方法来顺序访问一个聚合对象中的各个元素&#xff0c…

docker安装 Elasticsearch、Kibana、IK 分词器

Elasticsearch 1.拉去镜像 docker pull elasticsearch:8.12.2 docker pull kibana:8.12.22.创建挂载目录 mkdir /root/elasticsearch3.不挂载启动 docker run -d \ --restartalways \ --name fusion_elasticsearch \ --network fusion_network \ -p 9200:9200 \ -p …

Java面试宝典:Spring专题二

一、介绍下Spring中的事务 1.Spring事务的本质与价值 Spring事务本质是基于AOP的声明式事务封装,通过代理机制在目标方法前后注入事务管理逻辑(开启、提交/回滚)。其核心价值在于: 业务解耦:将事务控制从业务代码剥离,通过配置或注解管理(如@Transactional)。 统一抽…

DGMR压缩技术:让大规模视觉Transformer模型体积减半而性能不减

Transformer架构展现出卓越的扩展特性,其性能随模型容量增长而持续提升。大规模模型在获得优异性能的同时,也带来了显著的计算和存储开销。深入分析主流Transformer架构发现,多层感知器(MLP)模块占据了模型参数的主要部…

JavaWeb学习打卡14(JSP内置对象及作用域)

JSP 中9 大内置对象PageContext // 用来存东西Request // 用来存东西ResponseSession // 用来存东西Application (ServletContext) // 用来存东西config (ServletConfig)outpage…

涛思数据参与起草中国工业互联网研究院《工业数据库规范》全系列标准

最近,《工业数据库规范》系列团体标准正式发布。该标准由中国工业互联网研究院牵头,中国移动通信联合会发布,共分为三部分—— 第1部分:云数据库第2部分:实时数据库第3部分:时序数据库 涛思数据作为三项标…

使用exceljs导出luckysheet表格 纯前端 支持离线使用

一.技术 exceljs,luckysheet 二.实现 参考网上博文exceljs对导出lucksheet表格的实现,发现存在一些问题并给予修复: 1.字体颜色、字号,加粗等适配的问题. 2.单元格对齐方式不生效; 3.单元格边框无法绘制; 4.单元格边框颜色及线型错乱; 5.单元格列…

从0到1学习c++ 命名空间

也是好久没写博客了,主播这半年一直在忙别的领域,在磁力驱动领域干了一年,最好发现自己对这个领域并不是很感兴趣,做这个领域多半都是为了发文章,现在闲下来了,主播终于也是过上好日子了,主播又…

大模型提示词漏洞攻防测试:技术分析与实践指南

引言 随着ChatGPT、Claude、Gemini等大型语言模型(LLMs)的广泛应用,它们已经成为现代AI系统的核心组件,被整合到各种产品和服务中。这些模型通过提示。Prompts)与用户进行交互,而提示词作为人类与AI沟通的桥梁,其安全性变得尤为重…

Golang实现 - 实现只有表头的 Excel 模板,并在指定列添加了下拉框功能。生成的 Excel 文件在打开时,指定列的单元格会显示下拉选项

该版本完全兼容最新版 excelize 库 (v2.7),实现了只有表头的 Excel 模板,并在指定列添加了下拉框功能。生成的 Excel 文件在打开时,指定列的单元格会显示下拉选择箭头。代码如下:package mainimport ("fmt""log&qu…

全连接队列

监听套接字使用socket接口创建一个套接字,然后bind给套接字绑定地址,最后listen将套接字设置为监听套接字。监听套接字以前理解是三元组标识,后面看了netstat,觉得应该是五元组,只不过它这个五元组是{协议,…

JavaWeb-JSP

JSP JSP就是模板引擎 Template,因为看到的jsp是模板不变的,如果想让页面发生改变,就是自己添加java代码改变页面。有Java代码,Tomcat服务器就会对jsp模板进行解析,解析完之后就是Servlet(java类&#xff09…