You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash流压缩时为gzip文件嵌入原始文件名?

问题出在你用管道给gzip喂数据的时候——它根本不知道原始文件名是test.csv啊!默认情况下,gzip从标准输入读取内容时,不会自动存储原始文件名,所以解压后就只能得到test(从你输出的文件名test.gz去掉.gz后缀而来)。

要解决这个问题,你只需要明确告诉gzip要把哪个文件名存在压缩包的头部就行,给你两个实用方法:

1. 直接在gzip命令里指定原始文件名

修改最后一段的gzip命令,加上--name=test.csv参数:

gunzip -c ./test.zip | sed 's/;;/;0;/g' | sed 's/,/;/g' | sed 's/xy_ign/xy_ign_latitude;xy_ign_longitude/' | sed 's/xy_ign/xy_geopad_latitude;xy_geopad_longitude/' | gzip -9 --name="test.csv" > test.gz

这样生成的test.gz里就内置了test.csv这个原始文件名,之后直接跑gunzip test.gz,得到的就是test.csv,不用再加-N参数。

2. 用环境变量批量设置(适合重复操作)

如果你要多次执行这类流压缩命令,可以先设置GZIP环境变量,让gzip默认使用指定的文件名:

export GZIP="--name=test.csv"

之后再运行你的完整管道命令就行,效果和上面完全一样。

验证一下是否生效

你可以用gzip -l test.gz查看压缩包的元数据,输出里的Name列应该显示test.csv,这就说明文件名已经正确存进去了。

另外关于MySQL的LOAD DATA INFILE:只要你的MySQL支持读取压缩文件(检查have_compress系统变量是否为YES),直接指定test.gz的路径就行,MySQL会自动处理解压,内置的正确文件名也能避免任何文件名相关的匹配问题。

内容的提问来源于stack exchange,提问作者clood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:12:03