Gunzip 将 *.gz 文件解压缩到另一个位置

Gunzip 将 *.gz 文件解压缩到另一个位置

编写此代码是为了将多个 .tar 文件提取到另一个位置并且工作正常

ls -1 ${short_filename} \
| while read file; do \
  tar -zxvf "$file" -C ${pentaho_temp_path}/${sessionkey}; \
done

我想对 Linux 计算机上的 .gz 文件执行相同的操作。我的文件名称中没有空格,它们看起来像这样:

xport_RAN_Maa_LIM_10.93.217.170_20220629030929.xml.gz
xport_RAN_Maa_LIM_10.93.217.170_20220630030936.xml.gz 
xport_RAN_Mau_MPU_10.188.83.138_20220629031403.xml.gz 
xport_RAN_Mau_MPU_10.188.83.138_20220630031444.xml.gz 

答案1

gzip 文件不包含“文件”;只是字节流。因此,如果您想解压缩它们,只需gzip -d --stdout "${file}" > "${target_directory}/${target_file}"

请注意,您的脚本仅有的致力于*.tar.gz,已经,因为-z国旗了。

答案2

您的脚本不必要地复杂。可以在 和 处|以及do任何命令之后断行,因此\不需要您的任何行。完全相同的脚本可以这样写:

ls -1 "$short_filename" | 
    while read file; do
        tar -zxvf "$file" -C "$pentaho_temp_path/$sessionkey"
    done

但这是个坏主意。正如其他人指出的那样,解析ls非常脆弱,应该避免。在这种情况下也是没有意义的,因为上述脚本所需的只是:

for file in "$short_filename"/*; do
    tar -zxvf "$file" -C "$pentaho_temp_path/$sessionkey"
done

但由于您的文件都是公正的且未加焦油,因此您根本.gz不需要并且可以执行以下操作:tar

for file in "$short_filename"/*; do
    zcat "$file" > "$pentaho_temp_path/$sessionkey"/"$(basename "$file" .gz)"
done

答案3

考虑一下:

for file in "$short_filename"/*.gz; do
  zcat "$file" > "$pentaho_temp_path/$sessionkey/$(basename "$file" .gz)"
done
  • 避免管道ls输出
  • 仅过滤 .gz 扩展名
  • 解析完整路径以隔离不带扩展名的文件名basename "$fullpath" .gz

如果您确定没有文件名包含换行符,您可以通过管道它们来并行化该过程:

myzcat(){ zcat "$1" > "$pentaho_temp_path/$sessionkey/$(basename "$1" .gz)"; }

ls "$short_filename"/*.gz | parallel myzcat
  • 使用管道代替列表模型
  • 定义一个采用单个参数的局部函数
  • 运行与处理器数量一样多的并行进程

相关内容