Linux命令行:执行rm *.jpg时存储匹配文件名及获取*匹配文件名方法
如何存储通配符匹配到的文件名?
嘿,这两个问题本质上是一回事儿——都是要捕获shell通配符展开后的文件名,我来给你捋清楚最靠谱的做法:
1. 执行rm *.jpg时存储匹配的文件名
shell在执行任何命令前,会先把通配符(比如*.jpg)展开成实际的文件名列表。所以我们可以先把匹配结果存到数组里,再执行删除操作,这样既保留了文件名,又完成了删除:
# 第一步:把所有匹配的.jpg文件存入数组(数组能安全处理带空格/特殊字符的文件名) jpg_files=(*.jpg) # 可选:验证一下匹配到的内容 echo "即将删除的文件:${jpg_files[@]}" # 第二步:执行删除操作 rm "${jpg_files[@]}"
如果担心没有匹配到任何文件时,shell会把*.jpg当成一个字符串处理(比如尝试删除名为*.jpg的文件),可以先开启nullglob选项,让无匹配时通配符展开为空:
shopt -s nullglob # 开启无匹配时通配符为空的选项 jpg_files=(*.jpg) if [ ${#jpg_files[@]} -eq 0 ]; then echo "没有找到任何.jpg文件" else rm "${jpg_files[@]}" fi shopt -u nullglob # 用完可以关闭,恢复默认行为
2. 用*匹配文件时获取文件名
同样,最安全的方式还是用数组存储,尤其是当文件名包含空格、引号等特殊字符时:
# 把所有匹配*的文件存入数组 matched_files=(*) # 遍历数组查看每个文件名 for file in "${matched_files[@]}"; do echo "匹配到文件:$file" done
如果只是临时查看匹配结果,也可以用printf逐行输出(比echo *更靠谱,能正确显示带空格的文件名):
printf "匹配到的文件:\n%s\n" *
内容的提问来源于stack exchange,提问作者DENSETSU
相关产品推荐
相关产品推荐

