Bash脚本中传入Glob模式参数未被识别及文件找不到问题求助
解决Bash脚本中xargs传递Glob模式不被识别的问题
问题原因
你的问题核心在于Shell扩展顺序和xargs的参数处理逻辑冲突:
- 当你在命令中写
$Dir/{}_1_good_????.txt时,主Shell会优先尝试扩展????通配符,但此时{}还没被xargs替换成acc.txt里的实际编号,导致通配符匹配不到任何文件,最终带????的原始字符串被直接传给目标函数。 - 目标函数本身不具备Glob扩展能力,因此会把
ABC001_1_good_????.txt当作完整文件名,自然找不到对应文件。
具体解决方法
方法1:用子Shell处理Glob扩展
让xargs调用子Shell,确保每个替换后的路径在子Shell中完成通配符扩展。修改命令如下:
cat acc.txt | xargs -I{} bash -c '... --readFilesIn '"$Dir"'/{}_1_good_????.txt ...'
- 引号细节:
'"$Dir"'让主Shell先扩展$Dir变量,再将整体传给子Shell;剩余部分用单引号包裹,避免主Shell提前处理????通配符。
方法2:用find命令精准匹配文件(推荐)
如果每个编号对应多个匹配的txt文件,用find提前定位所有符合条件的文件,再传给目标函数,能彻底规避Glob扩展问题:
while read -r acc; do find "$Dir" -maxdepth 1 -type f -name "${acc}_1_good_????.txt" done < acc.txt | xargs ... --readFilesIn {} ...
- 这个方式逐个读取acc.txt的编号,用find精确匹配文件名,再把所有有效文件路径传给xargs,同时避免了xargs处理带空格编号时的拆分错误。
方法3:启用xargs的Glob扩展(兼容性差)
部分xargs版本支持-o选项(需配合交互式Shell),让xargs在参数替换后执行Glob扩展,但该选项兼容性有限,仅推荐在特定环境使用:
cat acc.txt | xargs -o -I{} ... --readFilesIn $Dir/{}_1_good_????.txt ...
注意事项
- 确认
$Dir变量已正确定义且指向目标目录,避免因路径错误导致文件找不到。 - 如果acc.txt中的编号包含空格、引号等特殊字符,必须使用
while read -r的方式处理,不能用cat|xargs,否则会导致参数拆分错误。
内容的提问来源于stack exchange,提问作者newstudenttoprogramming
相关产品推荐
相关产品推荐

