NiFi中使用ExecuteStreamCommand按匹配模式压缩多文件失败求助
我明白你遇到的困扰了——直接用/bin/zip加通配符part.*csv时,通配符没被正确解析,导致zip找不到目标文件。这是因为ExecuteStreamCommand默认会直接调用目标程序,不会通过shell处理通配符展开,所以*会被当作字面量传递给zip,它就会去寻找一个名叫part.*csv的文件,自然没法批量匹配到你需要的那些文件。
下面给你几个可行的解决方案:
方案1:通过bash shell执行命令(最直接)
我们可以把命令改成调用bash,让shell帮我们解析通配符。具体配置如下:
- Command:
/bin/bash - Command Arguments:
-c/bin/zip finalCompressedFile.zip part*.csv
这里的逻辑是:让bash执行引号里的zip命令,此时shell会把part*.csv展开成所有匹配的文件名,再传递给zip,这样就能实现批量压缩了。
如果你的目标文件不在ExecuteStreamCommand的默认工作目录,记得加上完整路径,比如:/bin/zip /path/to/output/finalCompressedFile.zip /path/to/files/part*.csv
方案2:用find命令适配复杂场景
如果你的文件分散在子目录里,或者需要更灵活的匹配规则,可以用find命令定位文件并传递给zip:
- Command:
/bin/bash - Command Arguments:
-cfind /path/to/target -name 'part*.csv' -exec /bin/zip finalCompressedFile.zip {} +
这个命令会遍历指定目录下所有匹配part*.csv的文件,一次性传递给zip完成压缩。
补充:为什么原来的配置失效?
再解释下核心原因:当你直接调用/bin/zip并传入part.*csv作为参数时,NiFi会直接把这个字符串原样传给zip程序,而不会让shell去解析通配符。zip本身不具备通配符解析能力,所以它会尝试寻找名为part.*csv的单个文件——这就是为什么指定完整文件名能生效,但批量处理不行的根源。
内容的提问来源于stack exchange,提问作者knowone

