文章目录
- 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命令的执行结果进行检查,并且输出相应的成功或失败信息。
使用现代命令替换语法:
把反引号替换成$(...),提升代码的可读性。