只解压缩特定的扩展名

我有一个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 /并将图像添加到该文件夹​​,以便files / archive1 / folder1.jpg,files / archive1 / rose_sun.gif。 对每个存档执行此操作。

我真的不知道如何做到这一点,所有的build议都是值得欢迎的。 我有超过600个档案,一个自动解决scheme将是一个救生员,最好是一个Linux解决scheme。

Solutions Collecting From Web of "只解压缩特定的扩展名"

有些东西是:

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

这是经过测试,将处理空格的文件名(压缩文件和提取的文件)。 如果压缩文件在不同目录中具有相同的文件名,则可能会发生冲突(如果要压扁目录结构,则无法避免此问题)。

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

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

(刚刚测试过,它的工作原理。)

简而言之

你可以用一行代码find + 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结合起来,可以提取所有拉链中的所有图像:

 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 。 请享用。

您可以使用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的Archive-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命令…

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

我没有测试过这个,但它应该工作…或者沿着这些线路。 绝对比第一个解决方案更高效。 🙂

希望这可以帮助!