décompressez extension spécifique seulement
Question
J'ai un répertoire avec des archives zip contenant .jpg, .png, .gif images. Je veux décompressez chaque archive prenant les images seulement et les mettre dans un dossier avec le nom de l'archive.
files/archive1.zip
files/archive2.zip
files/archive3.zip
files/archive4.zip
Ouvrir archive1.zip - prendre sunflower.jpg, rose_sun.gif. Faire un dossier de fichiers / archive1 / et ajoutez les images à ce dossier, les fichiers / archive1 / folder1.jpg, fichiers / archive1 / rose_sun.gif. Pour ce faire, à chaque archive.
Je ne sais vraiment pas comment cela peut se faire, toutes les suggestions sont les bienvenues. J'ai plus de 600 archives et une solution automatique serait une bouée de sauvetage, de préférence une solution Linux.
La solution
Quelque chose le long des lignes de:
#!/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
Ceci est testé et gérer les espaces dans les noms de fichiers (à la fois les fichiers zip et les fichiers extraits). Vous pouvez avoir des collisions si le fichier zip a le même nom de fichier dans des répertoires différents (vous ne pouvez pas éviter cela si vous allez aplatir la structure de répertoire).
Autres conseils
En bref
Vous pouvez le faire avec trouver une doublure + Décompressez.
find . -name "*.zip" -type f -exec unzip -jd "images/{}" "{}" "*.jpg" "*.png" "*.gif" \;
En détail
unzip
vous permet de spécifier les fichiers que vous souhaitez:
unzip archive.zip "*.jpg" "*.png" "*.gif"
Et -d
un répertoire cible:
unzip -d images/ archive.zip "*.jpg" "*.png" "*.gif"
Combinez cela avec un find
, et vous pouvez extraire toutes les images dans toutes les fermetures éclair:
find . -name "*.zip" -type f -exec unzip -d images/ {} "*.jpg" "*.png" "*.gif" \;
Utilisation unzip -j
Junk l'extraction de la structure de répertoire interne du zip, nous pouvons le faire en une seule commande. Cela vous donne la liste des images plates séparées par nom zip que vous désirez comme une doublure.
find . -name "*.zip" -type f -exec unzip -jd "images/{}" "{}" "*.jpg" "*.png" "*.gif" \;
Une limitation est que unzip -d
ne crée pas plus d'un nouveau niveau de répertoires, de sorte que mkdir images
premier. Profitez.
7zip peut le faire, et a un version Linux .
mkdir files/archive1
7z e -ofiles/archive1/ files/archive1.zip *.jpg *.png *.gif
(Juste testé, cela fonctionne.)
Vous pouvez écrire un programme en utilisant une bibliothèque zip. Si vous faites Mono, vous pouvez utiliser DotNetZip .
Le code ressemblerait à ceci:
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");
}
}
}
}
Voici mon avis sur la première réponse ...
#!/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
ou, si vous souhaitez simplement utiliser la commande unzip régulière ...
unzip -d ${dir_name}/ ${zip_name} *.jpg *.png *.gif
Je ne l'ai pas testé, mais il devrait fonctionner ... ou quelque chose le long de ces lignes. Sans aucun doute plus efficace que la première solution. :)
Hope this helps!