Bash脚本执行结果与终端直接执行不一致问题求助
Bash脚本中find命令通配符失效的问题与解决
问题描述
直接在终端执行以下find命令,能正常返回大量匹配的.txt文件:
find . -xdev -type d -path ./sys -o -path ./proc -o -path ./run -prune -o -iname "*.txt"
但把这个逻辑封装成脚本(脚本接收$1作为路径参数,匹配模式通过后续参数传入)后,执行bul . *.txt时仅返回单个结果。尝试开启extglob、调整命令格式等操作都无法解决问题。
原因分析
核心问题是终端的通配符提前展开:当你输入bul . *.txt时,当前shell会先把*.txt解析成当前目录下已存在的所有.txt文件名,再把这些具体文件名作为参数传给脚本。此时脚本里的find命令拿到的不是通配符*.txt,而是一堆具体的文件名,导致-iname参数无法按预期匹配所有符合条件的文件,最终结果异常。
解决方法
执行脚本时,用双引号包裹通配符*.txt,阻止终端提前展开:
bul . "*.txt"
这样脚本接收到的就是原始的通配符字符串,find命令可以正常用它去遍历匹配所有符合条件的文件,返回正确的大量结果。
内容的提问来源于stack exchange,提问作者srctghn
相关产品推荐
相关产品推荐

