распаковать только конкретное расширение - PullRequest
5 голосов
/ 26 мая 2009

У меня есть каталог с zip-архивами, содержащий изображения в формате .jpg, .png, .gif. Я хочу распаковать каждый архив, взяв только изображения и поместив их в папку с именем архива.

Итак:

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

Открыть archive1.zip - взять sunflower.jpg, rose_sun.gif. Создайте папку files / archive1 / и добавьте изображения в эту папку, чтобы файлы / archive1 / folder1.jpg, files / archive1 / rose_sun.gif. Сделайте это с каждым архивом.

Я действительно не знаю, как это можно сделать, все предложения приветствуются. У меня есть более 600 архивов, и автоматическое решение может быть спасением, предпочтительно решение для Linux.

Ответы [ 6 ]

4 голосов
/ 24 марта 2016

Короче

Вы можете сделать это с помощью поиска одной строки + распаковать.

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, и вы сможете извлечь все изображения во всех почтовых индексах:

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. Наслаждайтесь.

4 голосов
/ 26 мая 2009

7zip может сделать это и имеет версию Linux .

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

(только что проверил, работает.)

1 голос
/ 26 мая 2009

Perl's Archive-Zip - хорошая библиотека для архивирования / распаковки.

1 голос
/ 26 мая 2009

Что-то вроде:

#!/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 одинаковое имя файла в разных каталогах (этого нельзя избежать, если вы собираетесь сгладить структуру каталога).

1 голос
/ 26 мая 2009

Вы можете написать программу, используя библиотеку 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");
            }
        }
    }
}
0 голосов
/ 08 октября 2009

Вот мой взгляд на первый ответ ...

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

Я не проверял это, но оно должно работать ... или что-то в этом роде. Определенно более эффективный, чем первое решение. :)

Надеюсь, это поможет!

...