仅解压缩特定扩展名

发布于 2024-07-21 06:16:34 字数 443 浏览 3 评论 0原文

我有一个目录,其中包含 .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 解决方案。

I have a a directory with zip archives containing .jpg, .png, .gif images. I want to unzip each archive taking the images only and putting them in a folder with the name of the archive.

So:

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

Open archive1.zip - take sunflower.jpg, rose_sun.gif. Make a folder files/archive1/ and add the images to that folder, so files/archive1/folder1.jpg, files/archive1/rose_sun.gif. Do this to each archive.

I really don't know how this can be done, all suggestions are welcome. I have over 600 archives and an automatic solution would be a lifesaver, preferably a linux solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

瑾兮 2024-07-28 06:16:34

简而言之

您可以通过一行查找+解压缩来完成此操作。

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 结合起来code>,您可以提取所有 zip 中的所有图像:

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

使用 unzip -j 来垃圾化 zip 内部目录结构的提取,我们可以在一个命令中完成这一切。 这将为您提供由邮政编码名称分隔的平面图像列表,您希望将其作为一行。

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

一个限制是 unzip -d 不会创建多于一层的新目录,因此首先只需 mkdir images 。 享受。

In Short

You can do this with a one-liner find + unzip.

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

In Detail

unzip allows you to specify the files you want:

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

And -d a target directory:

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

Combine that with a find, and you can extract all the images in all zips:

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

Using unzip -j to junk the extraction of the zip's internal directory structure, we can do it all in one command. This gives you the flat image list separated by zip name that you desire as a one-liner.

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

A limitation is that unzip -d won't create more than one new level of directories, so just mkdir images first. Enjoy.

梦太阳 2024-07-28 06:16:34

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

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

(刚刚测试过,有效。)

7zip can do this, and has a Linux version.

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

(Just tested it, it works.)

忆梦 2024-07-28 06:16:34

大致如下:

#!/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 文件在不同的目录中具有相同的文件名,则可能会发生冲突(如果要扁平化目录结构,则无法避免这种情况)。

Something along the lines of:

#!/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

This is tested and will handle spaces in filenames (both the zip files and the extracted files). You may have collisions if the zip file has the same file name in different directories (you can't avoid this if you're going to flatten the directory structure).

柠栀 2024-07-28 06:16:34

您可以使用 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");
            }
        }
    }
}

You can write a program using a zip library. If you do Mono, you can use DotNetZip.

The code would look like this:

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");
            }
        }
    }
}
笙痞 2024-07-28 06:16:34

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

Perl's Archive-Zip is a good library for zipping/unzipping.

如果没有 2024-07-28 06:16:34

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

#!/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

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

希望这可以帮助!

Here's my take on the first answer...

#!/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

or, if you'd just like to use the regular unzip command...

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

I haven't tested this, but it should work... or something along these lines. Definitely more efficient than the first solution. :)

Hope this helps!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文