bash中使用find函数遍历子文件夹迭代运行程序无响应问题咨询
错误原因
- 查找范围配置错误:你在find命令中添加了
-maxdepth 1参数,只会搜索~/test一级目录下的vcf文件,不会遍历子目录。如果目标vcf文件存放在子目录中,find不会返回任何结果,循环自然不会执行,和你调试时仅输出find执行日志、无后续程序运行日志的表现完全匹配。 - 输出路径拼接错误:find返回的
$FILE是包含完整路径的字符串(例如/home/yourname/test/subdir/sample.vcf),直接拼接~/test/annotTest/$FILE.vcf.gz会生成非法路径,dotnet程序会因无法写入不存在的路径直接退出,关闭错误输出的场景下就会表现为“没有任何反应”。 - 写法存在鲁棒性缺陷:用for循环直接遍历find输出、变量不加双引号的写法,在文件名包含空格、换行、特殊字符时会出现参数拆分错误,导致程序接收的输入路径异常。
修复方案
首先确认输出目录存在,再改用更安全的find+while read写法,提取纯文件名做输出路径拼接,代码如下:
mkdir -p ~/test/annotTest find ~/test -type f -name '*.vcf' | while read -r FILE; do FILE_BASENAME=$(basename "$FILE") dotnet ~/Nirvana/Nirvana.dll \ -c ~/Nirvana/Data/Cache/GRCh37/Both \ --sd ~/Nirvana/Data/SupplementaryAnnotation/GRCh37 \ -r ~/Nirvana/Data/References/Homo_sapiens.GRCh37.Nirvana.dat \ -i "$FILE" \ -o ~/test/annotTest/"${FILE_BASENAME}".gz done
验证方法
执行循环前可先单独运行find命令确认可以匹配到目标文件:find ~/test -type f -name '*.vcf'
如果有返回结果,再执行上述循环即可。
内容的提问来源于stack exchange,提问作者vanish007
相关产品推荐
相关产品推荐

