批量生成含目录名与原始时间戳的tar文件技术问询
批量生成带目录名+时间戳的tar包方案
我帮你搞定这个批量打包的需求!这里有个实用的bash脚本,可以自动遍历目标目录下的所有子目录,提取它们的修改时间(就是你ls看到的那个时间),然后生成符合目录名_小写月份_日_年.tar格式的打包文件。
实现脚本
#!/bin/bash # 遍历当前目录下的所有子目录(要处理指定目录的话,把*/换成/path/to/your/target/*/) for dir in */; do # 去掉目录名末尾的斜杠,得到干净的目录名称 dir_name=${dir%/} # 提取目录的修改时间,并转换成jul_29_2016这样的格式 # 步骤:先获取ISO格式时间→转成月份缩写+日+年→转小写→去掉日期前的空格 timestamp=$(date -d "$(stat -c "%y" "$dir_name")" +"%b_%e_%Y" | tr '[:upper:]' '[:lower:]' | sed 's/_ /_/') # 拼接最终的tar文件名 tar_filename="${dir_name}_${timestamp}.tar" # 执行打包操作(如果需要压缩,把-cf改成-czf(gzip)或-cjf(bzip2)) tar -cf "$tar_filename" "$dir_name" # 输出日志,方便确认进度 echo "已完成打包:$tar_filename" done
关键部分解释
- 遍历目录:
for dir in */;会匹配当前目录下所有以斜杠结尾的项,也就是所有子目录,避免处理普通文件。 - 提取时间戳:
stat -c "%y" "$dir_name":获取目录的修改时间(和ls -ld显示的时间一致),输出类似2016-07-29 14:30:00的ISO格式。date -d ... +"%b_%e_%Y":把ISO时间转换成Jul 29 2016的格式,其中%b是月份缩写,%e是日期(空格填充),%Y是四位年份。tr和sed:把月份转成小写,同时去掉日期前面的空格(比如把jul_ 5_2024改成jul_5_2024)。
- 打包命令:
tar -cf是基础打包,如果需要压缩,换成tar -czf会生成.tar.gz压缩包,tar -cjf生成.tar.bz2压缩包。
注意事项
- 如果要处理指定路径下的目录,把循环里的
*/替换成目标路径,比如/data/backup/*/。 - 要是有需要排除的目录,可以在循环里加判断,比如:
if [ "$dir_name" = "temp" ] || [ "$dir_name" = "logs" ]; then echo "跳过目录:$dir_name" continue fi - 确保你有足够的权限读取目标目录和在当前路径创建tar文件。
内容的提问来源于stack exchange,提问作者user213618
相关产品推荐
相关产品推荐

