Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 仅解压缩特定扩展名_Linux_File_Archive_Unzip - Fatal编程技术网

Linux 仅解压缩特定扩展名

Linux 仅解压缩特定扩展名,linux,file,archive,unzip,Linux,File,Archive,Unzip,我有一个包含.jpg、.png、.gif图像的zip存档的目录。我想解压每个存档,只拍摄图像,并将它们放在一个带有存档名称的文件夹中 因此: 打开archive1.zip-以sunflower.jpg、rose_sun.gif为例。创建一个文件夹files/archive1/并将图像添加到该文件夹中,然后创建files/archive1/folder1.jpg、files/archive1/rose_sun.gif。对每个归档文件执行此操作 我真的不知道如何才能做到这一点,欢迎所有的建议。我有6

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

因此:

打开archive1.zip-以sunflower.jpg、rose_sun.gif为例。创建一个文件夹files/archive1/并将图像添加到该文件夹中,然后创建files/archive1/folder1.jpg、files/archive1/rose_sun.gif。对每个归档文件执行此操作

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

可以做到这一点,并且有一个解决方案


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

您可以使用zip库编写程序。如果你做单声道,你可以使用

代码如下所示:

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");
            }
        }
    }
}

大致如下:

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

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

以下是我对第一个答案的看法

#!/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
我还没有测试过这个,但它应该可以工作。。。或者类似的东西。肯定比第一个解决方案更有效。:)


希望这有帮助

简言之

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

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 . -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图像即可。享受。

这将是一个很好的解决方案,只是临时目录最终会浪费IO和系统资源。您应该向解压调用添加通配符。(将“.jpg.”png“*.gif”添加到末尾。)此外,您应该避免复制zip文件,而是使用“unzip../${newfile}/zip”。我不认为这里的效率水平是一个真正的问题,对我来说,这看起来像是一个一次性操作(或者是一个不经常进行的操作,不足以保证过度工程)。最终的结果是OP想要的,基于存档名称的特定目录中的图形文件。是的,这将是一次性的:),我想我现在正在本地测试所有这些解决方案,而不是在服务器上的更大数量的ZIP上尝试它OK,所以这方面的最大问题是,档案的名称中有空格,上面的代码创建了一堆文件夹,zip名称中的文本由空格分隔。简单地说,这一个对zip/*.zip中的文件也有类似的作用;do newfile=$(echo${file})解压${newfile}.jpg'.png''*.gif'donewell我想把它保留在linux上,所以最好不要.net,但是我应该能够做同样的事情,比如说使用java zip库不?对不起,我不知道java zip库是否有类似的功能。我的意思是,我相信你能做到,这只是一个简单的编程问题。但问题是有多少节目。当你说“我想把它放在Linux上,所以最好不要放在.NET上”——你知道Mono是在Linux上运行的吗?换句话说,您可以在Linux上使用C#和.NET。但是,如果我必须为每个zip运行这个程序,我可以添加一个while循环或其他什么吗?
find . -name "*.zip" -type f -exec unzip -d images/ {} "*.jpg" "*.png" "*.gif" \;
find . -name "*.zip" -type f -exec unzip -jd "images/{}" "{}" "*.jpg" "*.png" "*.gif" \;