仅解压缩特定扩展名

vac*_*che 5 linux file unzip archive

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

所以:

files/archive1.zip
files/archive2.zip
files/archive3.zip
files/archive4.zip
Run Code Online (Sandbox Code Playgroud)

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

我真的不知道如何做到这一点,欢迎所有的建议.我有超过600个档案,自动解决方案将成为救星,最好是Linux解决方案.

Bra*_*och 6

简而言之

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

find . -name "*.zip" -type f -exec unzip -jd "images/{}" "{}" "*.jpg" "*.png" "*.gif" \;
Run Code Online (Sandbox Code Playgroud)

详细

unzip 允许您指定所需的文件:

unzip archive.zip "*.jpg" "*.png" "*.gif"
Run Code Online (Sandbox Code Playgroud)

-d目标目录:

unzip -d images/ archive.zip "*.jpg" "*.png" "*.gif"
Run Code Online (Sandbox Code Playgroud)

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

find . -name "*.zip" -type f -exec unzip -d images/ {} "*.jpg" "*.png" "*.gif" \;
Run Code Online (Sandbox Code Playgroud)

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

find . -name "*.zip" -type f -exec unzip -jd "images/{}" "{}" "*.jpg" "*.png" "*.gif" \;
Run Code Online (Sandbox Code Playgroud)

一个限制是unzip -d创建的目录不会超过一个新级别,因此仅此mkdir images一个。请享用。


Mif*_*Fox 5

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

mkdir files/archive1
7z e -ofiles/archive1/ files/archive1.zip *.jpg *.png *.gif
Run Code Online (Sandbox Code Playgroud)

(刚刚测试过,它有效。)


pax*_*blo 1

大致如下:

#!/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
Run Code Online (Sandbox Code Playgroud)

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