Shell脚本如何通过通配符实现带日期后缀的properties文件备份
方案可行性结论
你设想的cp *.properties *.properties_BAK_DATE命令完全不可行,执行后只会报错,达不到预期效果。
核心原因是shell的通配符展开逻辑在命令执行前就会完成:运行命令时shell会先把当前目录下所有匹配通配符的文件名列出来替换到命令中,不会自动给每个源文件拼接你想要的备份后缀。如果当前目录下没有匹配*.properties_BAK_DATE的文件,展开后的命令最后一个参数就是字面量*.properties_BAK_DATE,并不是已存在的目录,cp接收多个源文件但最后一个参数不是目录时会直接抛出参数错误,不会生成任何备份文件。
正确实现方法
首先生成你要求的_BAK_DDMMYY格式后缀,其中DD是两位日期、MM是两位月份、YY是两位年份,用date命令直接生成即可,GNU/BSD版本的date都支持这个格式写法,跨Linux发行版、macOS环境都能正常使用。
通用Shell实现(无额外依赖,所有环境通用)
以下脚本复制即可直接使用:
#!/bin/bash # 生成符合规则的备份后缀 BAK_SUFFIX="_BAK_$(date +%d%m%y)" # 遍历所有后缀为properties的文件 for src_file in *.properties; do # 处理目录下无properties文件的边界情况,跳过无效的通配符匹配结果 [ -e "$src_file" ] || continue # 执行复制,目标文件名=原文件名+备份后缀 cp -- "$src_file" "${src_file}${BAK_SUFFIX}" done
几个细节说明:
- cp命令后的
--是为了兼容文件名开头带-的特殊场景,避免文件名被cp误识别为命令参数 - 增加文件存在性判断,是为了避免目录下没有properties文件时,shell把通配符
*.properties当成真实文件名去复制,生成无意义的垃圾文件 - 脚本执行完成后,你给出的三个示例文件会生成对应备份:
dev_app_s01.properties→dev_app_s01.properties_BAK_DDMMYYdev2_app2_s01.properties→dev2_app2_s01.properties_BAK_DDMMYYqa_app_s02.properties→qa_app_s02.properties_BAK_DDMMYY
简洁写法(需安装mmv工具)
如果你的环境允许安装额外工具,用mmv可以一行完成批量复制,不需要手写循环:
# Debian/Ubuntu系安装命令:apt install mmv mmv -c "*.properties" "#1.properties_BAK_$(date +%d%m%y)"
参数-c表示执行复制操作、不修改原文件,注意通配符模式要加双引号,避免被shell提前展开导致命令失效。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

