【问题标题】:unzip specific extension only仅解压缩特定的扩展名
【发布时间】:2010-10-28 20:44:31
【问题描述】:

我有一个包含 .jpg、.png、.gif 图像的 zip 存档目录。我想解压缩每个存档,只获取图像并将它们放在一个带有存档名称的文件夹中。

所以:

files/archive1.zip
files/archive2.zip
files/archive3.zip
files/archive4.zip

打开 archive1.zip - 获取 sunflower.jpg、rose_sun.gif。创建一个文件夹 files/archive1/ 并将图像添加到该文件夹​​,因此 files/archive1/folder1.jpg、files/archive1/rose_sun.gif。对每个存档执行此操作。

我真的不知道如何做到这一点,欢迎所有建议。我有 600 多个档案,自动解决方案将是救命稻草,最好是 linux 解决方案。

【问题讨论】:

    标签: linux file archive unzip


    【解决方案1】:

    简而言之

    您可以使用单行查找 + 解压缩来完成此操作。

    find . -name "*.zip" -type f -exec unzip -jd "images/{}" "{}" "*.jpg" "*.png" "*.gif" \;
    

    详细说明

    unzip 允许你指定你想要的文件:

    unzip archive.zip "*.jpg" "*.png" "*.gif"
    

    还有-d一个目标目录:

    unzip -d images/ archive.zip "*.jpg" "*.png" "*.gif"
    

    将其与find 结合,您可以提取所有 zip 中的所有图像:

    find . -name "*.zip" -type f -exec unzip -d images/ {} "*.jpg" "*.png" "*.gif" \;
    

    使用unzip -j 对zip 的内部目录结构进行垃圾提取,我们可以在一个命令中完成所有操作。这为您提供了由 zip 名称分隔的平面图像列表,您希望将其用作单行。

    find . -name "*.zip" -type f -exec unzip -jd "images/{}" "{}" "*.jpg" "*.png" "*.gif" \;
    

    一个限制是unzip -d 不会创建超过一个新级别的目录,所以首先mkdir images。享受吧。

    【讨论】:

      【解决方案2】:

      7zip 可以做到这一点,并且有一个Linux version

      mkdir files/archive1
      7z e -ofiles/archive1/ files/archive1.zip *.jpg *.png *.gif
      

      (刚刚测试过,它可以工作。)

      【讨论】:

      • 但是我必须为每个 zip 运行这个,我可以添加一个 while 循环还是什么?
      【解决方案3】:

      类似的东西:

      #!/bin/bash
      cd ~/basedir/files
      for file in *.zip ; do
          newfile=$(echo "${file}" | sed -e 's/^files.//' -e 's/.zip$//')
          echo ":${newfile}:"
          mkdir tmp
          rm -rf "${newfile}"
          mkdir "${newfile}"
          cp "${newfile}.zip" tmp
          cd tmp
          unzip "${newfile}.zip"
          find . -name '*.jpg' -exec cp {} "../${newfile}" ';'
          find . -name '*.gif' -exec cp {} "../${newfile}" ';'
          cd ..
          rm -rf tmp
      done
      

      这是经过测试的,将处理文件名中的空格(zip 文件和提取的文件)。如果 zip 文件在不同目录中具有相同的文件名,则可能会发生冲突(如果要展平目录结构,则无法避免这种情况)。

      【讨论】:

      • 这将是一个很好的解决方案,除了临时目录最终会浪费 IO 和系统资源。您应该在 unzip 调用中添加通配符。 (将 '.jpg' '.png' '*.gif' 添加到末尾。)此外,您应避免复制 zip 文件,而应使用 "unzip ../${newfile}/拉链”。
      • 我不认为效率水平在这里是一个真正的问题,这对我来说似乎是一次性操作(或者不会经常完成以保证过度设计的操作) .最终结果是 OP 想要的,基于存档名称的特定目录中的图形文件。
      • 是的,这将是一次性的 :),我想我现在正在本地测试所有这些解决方案,而不是在服务器上的大量 zip 上尝试
      • 好的,所以最大的问题是,档案的名称中包含空格,上面的代码创建了一堆文件夹,zip名称中的文本用空格分隔
      • 只是这个对 zip/*.zip 中的文件也做了类似的事情; do newfile=$(echo ${file}) unzip ${newfile} '.jpg' '.png' '*.gif' 完成
      【解决方案4】:

      您可以使用 zip 库编写程序。如果你使用 Mono,你可以使用DotNetZip

      代码如下所示:

      foreach (var archive in listOfZips)
      {
          using (var zip = ZipFile.Read(archive)
          {
              foreach (ZipEntry e in zip)
              {
                  if (IsImageFile(e.FileName))
                  {
                      e.FileName = System.IO.Path.Combine(archive.Replace(".zip",""), 
                                        System.IO.Path.GetFileName(e.FileName));
                      e.Extract("files");
                  }
              }
          }
      }
      

      【讨论】:

      • 好吧,我想把它保存在 linux 上,所以最好不要 .net,但我应该能够做同样的事情,比如说使用 java zip 库不?
      • 对不起,我不知道Java zip库是否有类似的功能。我的意思是,我相信你可以做到,这是一个简单的编程问题。但问题是多少编程。当你说“我想把它保留在 Linux 上,所以最好不要 .NET”时——你知道 Mono 在 Linux 上运行吗?换句话说,您可以在 Linux 上使用 C# 和 .NET。
      【解决方案5】:

      Perl 的Archive-Zip 是一个很好的压缩/解压缩库。

      【讨论】:

        【解决方案6】:

        这是我对第一个答案的看法......

        #!/bin/bash
        cd files
        for zip_name in *.zip ; do
            dir_name=$(echo "${zip_name}" | sed -e 's/^files.//' -e 's/.zip$//')
            mkdir ${dir_name}
            7z e -o${dir_name}/ ${zip_name} *.jpg *.png *.gif
        done
        

        或者,如果您只想使用常规解压缩命令...

        unzip -d ${dir_name}/ ${zip_name} *.jpg *.png *.gif
        

        我没有对此进行测试,但它应该可以工作......或者类似的东西。绝对比第一个解决方案更有效。 :)

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 2018-07-25
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 2010-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多