You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_DDMMYY
    • dev2_app2_s01.properties → dev2_app2_s01.properties_BAK_DDMMYY
    • qa_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:27:21