Linux 仅解压缩特定扩展名
我有一个包含.jpg、.png、.gif图像的zip存档的目录。我想解压每个存档,只拍摄图像,并将它们放在一个带有存档名称的文件夹中 因此: 打开archive1.zip-以sunflower.jpg、rose_sun.gif为例。创建一个文件夹files/archive1/并将图像添加到该文件夹中,然后创建files/archive1/folder1.jpg、files/archive1/rose_sun.gif。对每个归档文件执行此操作 我真的不知道如何才能做到这一点,欢迎所有的建议。我有600多个存档,一个自动解决方案将是一个救命稻草,最好是linux解决方案。可以做到这一点,并且有一个解决方案Linux 仅解压缩特定扩展名,linux,file,archive,unzip,Linux,File,Archive,Unzip,我有一个包含.jpg、.png、.gif图像的zip存档的目录。我想解压每个存档,只拍摄图像,并将它们放在一个带有存档名称的文件夹中 因此: 打开archive1.zip-以sunflower.jpg、rose_sun.gif为例。创建一个文件夹files/archive1/并将图像添加到该文件夹中,然后创建files/archive1/folder1.jpg、files/archive1/rose_sun.gif。对每个归档文件执行此操作 我真的不知道如何才能做到这一点,欢迎所有的建议。我有6
(刚刚测试过,它可以工作。)您可以使用zip库编写程序。如果你做单声道,你可以使用 代码如下所示:
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");
}
}
}
}
大致如下:
#!/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文件在不同的目录中具有相同的文件名,则可能会发生冲突(如果要扁平化目录结构,则无法避免这种情况)。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 -d ${dir_name}/ ${zip_name} *.jpg *.png *.gif
我还没有测试过这个,但它应该可以工作。。。或者类似的东西。肯定比第一个解决方案更有效。:)
希望这有帮助 简言之 您可以使用一行查找+解压缩来完成此操作
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 . -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图像即可。享受。这将是一个很好的解决方案,只是临时目录最终会浪费IO和系统资源。您应该向解压调用添加通配符。(将“.jpg.”png“*.gif”添加到末尾。)此外,您应该避免复制zip文件,而是使用“unzip../${newfile}/zip”。我不认为这里的效率水平是一个真正的问题,对我来说,这看起来像是一个一次性操作(或者是一个不经常进行的操作,不足以保证过度工程)。最终的结果是OP想要的,基于存档名称的特定目录中的图形文件。是的,这将是一次性的:),我想我现在正在本地测试所有这些解决方案,而不是在服务器上的更大数量的ZIP上尝试它OK,所以这方面的最大问题是,档案的名称中有空格,上面的代码创建了一堆文件夹,zip名称中的文本由空格分隔。简单地说,这一个对zip/*.zip中的文件也有类似的作用;do newfile=$(echo${file})解压${newfile}.jpg'.png''*.gif'donewell我想把它保留在linux上,所以最好不要.net,但是我应该能够做同样的事情,比如说使用java zip库不?对不起,我不知道java zip库是否有类似的功能。我的意思是,我相信你能做到,这只是一个简单的编程问题。但问题是有多少节目。当你说“我想把它放在Linux上,所以最好不要放在.NET上”——你知道Mono是在Linux上运行的吗?换句话说,您可以在Linux上使用C#和.NET。但是,如果我必须为每个zip运行这个程序,我可以添加一个while循环或其他什么吗?
find . -name "*.zip" -type f -exec unzip -d images/ {} "*.jpg" "*.png" "*.gif" \;
find . -name "*.zip" -type f -exec unzip -jd "images/{}" "{}" "*.jpg" "*.png" "*.gif" \;