Node.js使用spawnSync调用tar生成空归档文件问题求助
Node.js中spawnSync调用tar生成空归档文件的问题
我在某目录下有一批文本文件(称为索引文件),每个文件内包含以换行符分隔的文件列表。在Node.js脚本中,我遍历这些索引文件,使用spawnSync调用tar命令,通过-T参数传入索引文件,预期tar会将索引文件中列出的所有文件归档。但实际生成的却是完全空的归档文件,且无任何输出。
脚本相关代码
console.log("Processing index files"); process.chdir(sourcePath); for(const key in indexFiles) { let index = indexFiles[key]; console.log("Processing: "+index); let commandLine = "tar acf "+outputPath+'/'+key+".tar.bz2 -T "+index; console.log(process.cwd()); console.log(commandLine); let tar = spawnSync("tar", ["acf", outputPath+"/"+key+".tar.bz2", "-T", index], {cwd:sourcePath, stdio:"inherit"}); }
其中sourcePath是索引文件中列出的文件所在位置,我将其设为CWD,与命令行执行tar的方式一致。
日志输出
Processing index files /media/chmo/NewLinux/scan/2022-03-22/temp Processing: /media/chmo/NewLinux/wrangled/d01d36c8-698a-4791-9075-73fa4c0af881_0.txt /media/chmo/NewLinux/scan/2022-03-22/temp tar acf /media/chmo/NewLinux/wrangled/0.tar.bz2 -T /media/chmo/NewLinux/wrangled/d01d36c8-698a-4791-9075-73fa4c0af881_0.txt
手动切换到日志显示的CWD并执行对应命令完全正常,但Node.js中执行却生成空归档文件,请问问题出在哪里?
问题原因
问题出在spawnSync传递的tar参数格式上。在shell中执行tar acf ...时,shell会自动将不带短横线的组合短选项解析为-a -c -f,但直接通过spawnSync传递"acf"作为参数时,tar会把它当作要归档的文件名而非选项。此时tar会尝试归档acf这个不存在的文件,加上后续参数被错误解析,最终生成空归档。
解决方法
修改spawnSync的参数列表,给tar选项加上短横线-,有两种写法:
写法1:使用组合选项加短横线
let tar = spawnSync("tar", ["-acf", outputPath+"/"+key+".tar.bz2", "-T", index], {cwd:sourcePath, stdio:"inherit"});
写法2:拆分单个选项加短横线
let tar = spawnSync("tar", ["-a", "-c", "-f", outputPath+"/"+key+".tar.bz2", "-T", index], {cwd:sourcePath, stdio:"inherit"});
两种写法都能让tar正确识别选项,读取索引文件中的列表完成归档,和手动执行命令的效果一致。
内容的提问来源于stack exchange,提问作者ChrisM
相关产品推荐
相关产品推荐

