質問

しているディレクトリをzipアーカイブを含むjpg、.png.gifます。たいへの解凍ダウンロードし、各アーカイブの画像だけフォルダの名前のアーカイブを展開します。

い:

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

Open archive1.zip ●sunflower.jpg,rose_sun.gif.フォルダの作成ファイル/archive1/メモリの使用範囲のサイズは画像をフォルダでfiles/archive1/folder1.jpg,files/archive1/rose_sun.gif.このため、各アーカイブを展開します。

ないんですけどこれを行うには、すべてのご提案を歓迎します。私は600以上のアーカイブや自動解決するようにしてほ、好ましくはlinuxます。

役に立ちましたか?

解決

の線に沿って何かます:

#!/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ファイルが異なるディレクトリに同じファイル名を持っている場合は、(あなたは、ディレクトリ構造を平らにするつもりなら、あなたがこの問題を回避することはできません)の衝突を持っていることがあります。

他のヒント

させることができ、ライナー見+unzip.

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, までのすべての画像はすべてのzips:

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 ます。楽しめます。

7zip ることができ、 Linux版.

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

(試験を実施し、その効果がある。)

あなたはジップライブラリを使用してプログラムを書くことができます。あなたがモノを行う場合は、 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");
            }
        }
    }
}

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コマンドを使用したい場合は...

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

私はこれをテストしていませんが、それは仕事...またはこれらの線に沿って何かする必要があります。間違いなく、より効率的な最初のソリューションよりも。 :)

この情報がお役に立てば幸い!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top