gpt4 book ai didi

bash - 使用 bash 一个一个地读取 zip 文件中的文件

转载 作者:行者123 更新时间:2023-12-05 03:08:09 26 4
gpt4 key购买 nike

我想打开 .zip 文件中的文件并阅读它们。在这个 zip 文件中,我有许多 .gz 文件,例如 a.dat.gz、b.dat.gz 等等。

到目前为止我的代码:

for i in $(unzip -p sample.zip)
do
for line in $(zcat "$i")
do
# do some stuff here
done
done

最佳答案

您需要两个循环是正确的。首先,您需要存档中的文件列表。然后,您需要在每个文件中进行迭代。

unzip -l sample.zip |sed '
/^ *[0-9][0-9]* *2[0-9-]* *[0-9][0-9]:[0-9][0-9] */!d; s///
' |while IFS= read file
unzip -p sample.zip "$file" |gunzip -c |while IFS= read line
# do stuff to "$line" here
done
done

这里假定 zip 存档中的每个文件本身都是一个 gzip 存档。否则你会从 gunzip 中得到一个错误。

代码遍历

unzip -l archive.zip 将列出内容。它的原始输出如下所示:

Archive:  test.zip
Length Date Time Name
--------- ---------- ----- ----
9 2017-08-24 13:45 1.txt
9 2017-08-24 13:45 2.txt
--------- -------
18 2 files

因此我们需要解析它。我选择使用 sed 进行解析,因为它快速、简单,并且可以正确保留空格(如果您的文件名称中包含制表符怎么办?)请注意,如果文件中有换行符,这将不起作用。不要那样做。

sed 命令使用正则表达式 ( explanation here ) 来匹配包含文件名的所有行,文件名本身除外。当匹配器触发时,sed 被告知不要删除 (!d),这实际上是告诉 sed 跳过任何不匹配的内容(如标题行)。第二个命令 s/// 告诉 sed 用空字符串替换先前匹配的文本,因此每行输出一个文件名。这将作为 $file 通过管道传输到 while 循环中。 (read 之前的 IFS= 部分防止空格从两端被剥离,请参见下面的注释。)

然后我们可以只解压缩我们正在迭代的文件,再次使用 unzip -p 将它打印到标准输出,这样它就可以作为 $ 存储在内部 while 循环中行

实验简化

我不确定这有多可靠,但您可以更简单地做到这一点:

unzip -p sample.zip |gunzip -c |while read line
# do stuff to "$line"
done

应该可以工作,因为 unzip -p archive 吐出存档中每个文件的内容,所有内容连接在一起,没有任何分隔符或元数据(如文件名) 因为 gzip 格式接受将存档连接在一起(请参阅 my notes on concatenated archives ),所以 gunzip -c 管道命令会看到原始 gzip 数据并在控制台上将其解压缩,这然后传递给 shell 的 while 循环。在这种方法中,您将缺少文件边界和名称,但速度要快得多。

关于bash - 使用 bash 一个一个地读取 zip 文件中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45863093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com