6

我收到了一个包含 40 个同名文件的 zip 文件。我想将这些文件中的每一个提取到一个单独的文件夹中,或者使用不同的名称(file1、file2 等)提取每个文件。

有没有办法使用标准的 linux 工具自动执行此操作?检查 man unzip 没有发现任何可以帮助我的东西。zipsplit 似乎也不允许任意拆分 zip 文件(我试图将 zip 拆分为 40 个档案,每个档案包含一个文件)。

目前我正在(r)单独命名我的文件。对于 40 个文件的存档,这不是什么大问题,但显然是不可扩展的。

任何人都有一个很好,简单的方法来做到这一点?比什么都好奇。

谢谢。

4

4 回答 4

6

假设目前不存在这样的工具,那么用 python 编写一个应该很容易。Python 有一个zipfile 模块,应该足够了。

像这样的东西(也许,未经测试):

#!/usr/bin/env python

import os
import sys
import zipfile

count = 0

z = zipfile.ZipFile(sys.argv[1],"r")

for info in z.infolist():
    directory = str(count)
    os.makedirs(directory)
    z.extract(info,directory)
    count += 1

z.close()
于 2009-10-13T16:31:27.703 回答
3

我知道这已经有几年了,但上面的答案并没有解决我的特定问题,所以我想我应该继续发布一个对我有用的解决方案。

无需脚本,您只需使用命令行输入即可与解压缩工具文本界面进行交互。也就是说,当您在命令行键入时:

unzip file.zip

它包含同名的文件,它会提示您:

replace sameName.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename:

如果您想手动执行此操作,您可以输入“r”,然后在下一个提示符处:

new name:

您只需键入新的文件名。

要自动执行此操作,只需创建一个包含对这些提示的响应的文本文件,并将其用作解压缩的输入,如下所示。

r
sameName_1.txt
r
sameName_2.txt
...

使用您最喜欢的脚本语言很容易生成。将其保存为 unzip_input.txt,然后将其用作解压缩的输入,如下所示:

unzip < unzip_input.txt

对我来说,这比试图让 Perl 或 Python 提取模块按照我需要的方式工作更让人头疼。希望这可以帮助某人...

于 2012-12-10T18:37:22.550 回答
2

这是一个linux脚本版本

在这种情况下, 834733991_T_ONTIME.csv 是每个 zip 文件中相同的文件名,并且“$count”之后的 .csv 只需与您想要的文件类型交换

#!/bin/bash

count=0

for a in *.zip
do
    unzip -q "$a"
    mv 834733991_T_ONTIME.csv "$count".csv
    count=$(($count+1))
done`
于 2012-07-30T13:39:58.760 回答
0

这个帖子很旧,但仍有改进的余地。就个人而言,我更喜欢 bash 中的以下单行代码

unzipd ()
{
    unzip -d "${1%.*}" "$1"
}

删除扩展并使用

于 2021-01-08T14:22:13.313 回答