如何编写脚本实现基于部分文件名复制Linux目录中指定开头的文件并添加新后缀
嘿,我明白你遇到的麻烦了——要批量处理一批开头格式固定的文件,之前的循环没搞定对吧?其实用Linux的基础命令就能轻松解决,不用提前准备文件列表,我给你几个靠谱的方法:
方法1:用Bash循环逐个处理(推荐)
这是最直观且不容易出错的方式,能精准给每个匹配的文件加上后缀:
# 把xx_xxxx_xx替换成你实际需要匹配的开头格式 for file in xx_xxxx_xx*; do # 先检查是否是普通文件,避免误操作目录 if [ -f "$file" ]; then # 把_copy替换成你想要的后缀,比如.bak cp "$file" "${file}_copy" fi done
关键细节解释:
xx_xxxx_xx*:Bash的通配符,*会匹配任意长度的任意字符,完美覆盖所有以指定格式开头的文件(不管后面跟着什么内容或后缀)。[ -f "$file" ]:这一步很重要,能过滤掉同名开头的目录,避免把目录也复制了。${file}_copy:Bash的变量扩展语法,会自动把原文件名和你要加的后缀拼接起来。比如原文件是xx_xxxx_xx_sales.csv,执行后会生成xx_xxxx_xx_sales.csv_copy;如果想加的是.bak这类后缀,改成${file}.bak就行。
举个实际例子:如果你要匹配开头是ab_cdef_gh的文件,复制后加.bak后缀,命令就是:
for file in ab_cdef_gh*; do if [ -f "$file" ]; then cp "$file" "${file}.bak" fi done
方法2:用find命令(适合复杂场景)
如果你的文件分散在子目录里,或者需要更精细的筛选(比如只处理特定类型的文件),find命令会更灵活:
# 同样替换xx_xxxx_xx和.bak为你的实际需求 find . -maxdepth 1 -type f -name "xx_xxxx_xx*" -exec cp {} {}.bak \;
各参数说明:
-maxdepth 1:限制只在当前目录查找,不递归进入子目录(如果需要递归就去掉这个参数)。-type f:只匹配普通文件,跳过目录、链接等。-name "xx_xxxx_xx*":指定文件名的匹配规则,和之前的通配符逻辑一致。-exec cp {} {}.bak \;:对每个找到的文件执行复制操作,{}代表找到的文件名,末尾自动加上.bak后缀。
注意事项
- 如果你的文件名里包含空格、括号这类特殊字符,一定要用双引号包裹变量(比如
"$file"),否则Bash会把文件名拆成多个部分处理,导致出错。 - 执行命令前可以先把
cp换成echo,比如echo cp "$file" "${file}_copy",这样能先预览要执行的操作,避免误删或复制错文件。
内容的提问来源于stack exchange,提问作者Tommosaurus
相关产品推荐
相关产品推荐

