从多个 zip 文件中提取一个文件

从多个 zip 文件中提取一个文件

我有一个文件夹树,其中包含多个 .zip 文件夹(大约 600 个),每个文件夹包含四个文件。我希望从每个文件夹中提取一个文件并将其复制到一个单独的文件夹中。让事情变得复杂的是,每个文件夹中的文件都具有相同的名称。是否有一个我可以运行的脚本来执行此操作?任何帮助表示赞赏。

答案1

您可以尝试以下操作:

mkdir -p "DESTDIR"
for i in *.zip ; do
         unzip "$i" "THEFILE" -d "DESTDIR"
         mv "DESTDIR/THEFILE" "DESTDIR/$(basename "$i" .zip)_THEFILE"
done

DESTDIR用目标路径替换。并THEFILE用您要提取的每个 .zip 文件中的文件的文件名替换。文件将根据 zip 文件的文件名重命名。

答案2

信息压缩unzip程序可以识别全局模式在文件名中。因此,如果您的 zip 文件包含file1.gz在不同文件夹中调用的许多文件:

$ unzip FolderName.zip '*/file1.gz'
Archive:  FolderName.zip
 extracting: FolderName/b/c/file1.gz          
 extracting: FolderName/b/e/file1.gz          
 extracting: FolderName/b/f/file1.gz 

尽管事实上FolderName.zip还包含名为 things 的文件其他file1.gz。如果您可以将所需的文件与 glob 模式匹配,unzip则可以提取它。

我从您的其他评论中得到的印象是您需要连接所有这些提取的文件。假设包含输出的顶级文件夹unzip名为FolderName,并且目标文件 ( file1.gz) 在所有子文件夹中位于相同的文件夹深度,这样的操作将执行您想要的操作:

$ gzcat FolderName/*/*/file1.gz > one-big-uncompressed-log-file

也就是说,它会跳过两个子文件夹级别来提取file1.gz文件,然后解压缩并将它们与通用gzcat程序连接起来,这在您找到gzip支持的大多数地方都可以找到。

相关内容