문제

.jpg, .png, .gif images가 포함 된 zip 아카이브가 포함 된 AA 디렉토리가 있습니다. 각 아카이브를 압축하고 이미지를 찍고 아카이브의 이름을 가진 폴더에 넣고 싶습니다.

그래서:

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

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 파일에 다른 디렉토리에 동일한 파일 이름이있는 경우 충돌이있을 수 있습니다 (디렉토리 구조를 평평하게하려면이를 피할 수 없습니다).

다른 팁

요컨대

1 라이너 찾기 + 압축 으로이 작업을 수행 할 수 있습니다.

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"

그것을 a와 결합하십시오 find, 모든 ZIPS에서 모든 이미지를 추출 할 수 있습니다.

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 첫 번째. 즐기다.

7zip 이것을 할 수 있고, 리눅스 버전.

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

(방금 테스트했는데 작동합니다.)

Zip 라이브러리를 사용하여 프로그램을 작성할 수 있습니다. 모노를 사용하면 사용할 수 있습니다 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 's 아카이브 zip 지핑/압축을 풀기에 좋은 라이브러리입니다.

첫 번째 답변에 대한 내 생각은 다음과 같습니다 ...

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

나는 이것을 테스트하지 않았지만 작동해야합니다 ... 또는이 라인을 따라 무언가가 작동해야합니다. 첫 번째 솔루션보다 확실히 더 효율적입니다. :)

도움이 되었기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top