编写此代码是为了将多个 .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
- 使用管道代替列表模型
- 定义一个采用单个参数的局部函数
- 运行与处理器数量一样多的并行进程