如何使用bash将多个带不同版本号的文件从一个目录复制到另一个?
错误原因
- 通配符
*被双引号包裹时,Shell 会将其识别为普通字符,不会触发文件名匹配展开,你脚本中"/home/user/Document/folderpath/$file"的写法把*直接当做了文件名的一部分,自然找不到对应文件 - 原始
for file incat files.txt``的写法只会原样读取每行的规则字符串,不会触发通配符解析逻辑 - 额外注意路径拼写错误:你描述的目标备份目录为
/home/user/Document/backuppath,但示例脚本里写的是/home/user/Documents/backuppath(多了字母s),如果实际路径无s也会触发报错
修复方案
修改move.sh脚本内容如下即可实现通配符匹配,兼容后续版本号变动:
#!/bin/bash # 定义源目录、目标目录 SRC_DIR="/home/user/Document/folderpath" DEST_DIR="/home/user/Document/backuppath" # 开启nullglob,匹配不到文件时不执行cp避免报错 shopt -s nullglob # 提前创建目标目录,避免目录不存在报错 mkdir -p "$DEST_DIR" # 逐行读取files.txt的匹配规则,跳过空行和注释行 while IFS= read -r pattern; do [[ -z "$pattern" || "$pattern" == \#* ]] && continue # 通配符部分不包裹引号,触发Shell自动展开匹配 cp "$SRC_DIR"/$pattern "$DEST_DIR"/ done < files.txt
关键修改说明
- 通配符对应的
$pattern变量不包裹引号,确保Shell可以正常展开*匹配对应版本号的文件 - 替换
for cat的写法为while read逐行读取,避免规则包含空格或特殊字符时出现拆分错误 - 增加
shopt -s nullglob配置,某条规则匹配不到文件时不会执行cp,避免无匹配时报错
内容的提问来源于stack exchange,提问作者Wolf
相关产品推荐
相关产品推荐

