Bash for循环实现file-a[数字]文件移至dirA的问题求助
解决Bash脚本for循环移动文件的问题
先纠正你原命令和脚本里的关键错误,再给出正确实现方式:
原命令的语法错误
你无for循环的命令中,awk的正则匹配运算符写错了,应该用~而非-;同时正则需补充前缀file-才能精准匹配file-a[数字]格式的文件,正确命令为:
mv $(ls -la | awk '$9 ~ /file-a[0-9]+/ {print $9}') dirA
for循环脚本的问题
你的脚本存在两个核心错误:
- 数组赋值未使用命令替换:
FILES=(ls -la | awk ...)会把ls、-la等字符串存入数组,而非命令执行后的文件名列表,需用$()包裹整个命令。 - 遍历方式错误:
for arg in "$FILES"会把整个数组当作单个元素处理,无法逐个遍历文件名。
修正后的for循环脚本
# 正确赋值数组,修正awk匹配规则 FILES=($(ls -la | awk '$9 ~ /file-a[0-9]+/ {print $9}')) # 遍历数组的每个元素 for arg in "${FILES[@]}" do mv "$arg" dirA done
更安全的实现方式(不推荐解析ls输出)
解析ls输出存在风险(比如文件名含空格、特殊字符时会出错),更可靠的方法是直接用Bash的glob匹配:
无for循环的简洁写法
mv file-a[0-9]* dirA
用for循环的安全写法
for arg in file-a[0-9]* do # 确保是普通文件,避免匹配到目录或不存在的文件 if [ -f "$arg" ]; then mv "$arg" dirA fi done
内容的提问来源于stack exchange,提问作者VuciuS
相关产品推荐
相关产品推荐

