如何在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
相关产品推荐
相关产品推荐

