Linux下zsh自定义并行版find命令ff函数执行无返回问题排查
问题原因
- grep 匹配规则不匹配传入参数格式
你传入的第二个参数'*.R'是shell通配符格式,但grep默认走正则表达式解析逻辑:正则里的*是量词,代表匹配前一个字符0次或多次,你写的*.R在正则场景下属于无效/不符合预期的表达式,自然匹配不到任何结果。就算你给grep加-F参数按纯文本匹配,带*的参数也没法命中你要的.R后缀文件。 - 参数没有加引号导致解析错误
函数里直接写$1/*和$2没有用双引号包裹,要是传入的路径包含空格、特殊字符,会直接被shell拆分成多个参数,执行逻辑完全错乱。同时zsh会在函数执行阶段就提前展开$1/*,如果路径下没有匹配的文件会直接抛错,不符合给parallel传参的预期。 - 逻辑冗余增加出错概率
find本身就自带-name参数支持通配符匹配文件名,完全不需要额外管道接grep,多一层管道反而容易出现路径误匹配(比如路径中间带.R的目录也会被错误命中),还额外增加性能开销。
修复后的函数
ff () { # 参数校验,避免漏传参数出错 if [[ $# -ne 2 ]]; then echo "用法: ff <搜索根目录> <文件名匹配模式>" return 1 fi # 并行对根目录下的一级子项执行find,直接用-name匹配目标文件名 parallel -j8 find {} -type f -name "$2" ::: "$1"/* }
修复后执行ff . '*.R'就能正常返回所有.R后缀的文件路径。
内容的提问来源于stack exchange,提问作者user1773603
相关产品推荐
相关产品推荐

