web-dev-qa-db-fra.com

Créez un dossier dédié pour tous les fichiers Zip d'un répertoire et extrayez les fichiers Zip

Si je choisis un fichier Zip et que je fais un clic droit "extraire ici", un dossier avec le nom du fichier Zip est créé et tout le contenu du fichier Zip y est extrait.

Cependant, je voudrais convertir plusieurs fichiers Zip via Shell. Mais quand je fais

unzip filename.Zip

le dossier "filename" n'est pas créé mais tous les fichiers sont extraits dans le répertoire courant.

J'ai regardé les paramètres mais il n'y a pas un tel paramètre. J'ai aussi essayé

for zipfile in \*.Zip; do mkdir $zipfile; unzip $zipfile -d $zipfile/; done

mais le .Zip l'extension du 2. $ zipfile et du 4. $ zipfile doit être supprimée avec sed. Si je fais

for zipfile in \*.Zip; do mkdir sed 's/\.Zip//i' $zipfile; unzip $zipfile -d sed 's/\.Zip//i' $zipfile/; done 

ça ne marche pas.

Comment remplacer le .Zip extension de $zipfile correctement?

Existe-t-il un moyen plus simple qu'un script Shell?

47
creativeDev

"extraire ici" est simplement une fonction du wrapper unzip que vous utilisez. unzip extraira uniquement ce qui se trouve réellement dans l'archive. Il n'y a probablement pas de moyen plus simple qu'un script Shell. Mais sed, awk etc. ne sont pas nécessaires pour cela si vous avez un shell compatible POSIX:

for f in *.Zip; do unzip -d "${f%*.Zip}" "$f"; done

(Vous NE DEVEZ PAS échapper au * ou l'extension du nom de chemin n'aura pas lieu.) Sachez que si l'archive Zip contient un répertoire, comme avec les archives Eclipse (qui contiennent toujours Eclipse/), vous vous retrouvez avec ./Eclipse*/Eclipse/eclipse.ini dans tout les cas. Ajoutez echo avant unzip pour un essai à sec.

44
PointedEars

unzip file.Zip -d xxx extraira les fichiers dans le répertoire xxx et xxx sera créé s'il n'y est pas. Vous pouvez consulter la page de manuel pour plus de détails.

La ligne awk ci-dessous devrait faire le travail:

ls *.Zip|awk -F'.Zip' '{print "unzip "$0" -d "$1}'|sh

Voir le test ci-dessous,

note que j'ai supprimé |sh à la fin, car mes zips sont de fausses archives; Je veux juste montrer la ligne de commande générée ici.

kent$  ls -l
total 0
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 001.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 002.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 003.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 004.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 005.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 006.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 007.Zip

kent$  ls *.Zip|awk -F'.Zip' '{print "unzip "$0" -d "$1}'
unzip 001.Zip -d 001
unzip 002.Zip -d 002
unzip 003.Zip -d 003
unzip 004.Zip -d 004
unzip 005.Zip -d 005
unzip 006.Zip -d 006
unzip 007.Zip -d 007
84
Kent

Si vous avez p7Zip, la version en ligne de commande de 7Zip installée, vous pouvez utiliser:

7z x '*.Zip' -o'*'
8
Franz Knülle

Ajoutez le nom du dossier et la barre oblique après le commutateur, par exemple:

unzip -d newfolder/ zipfile.Zip

Zip créera le dossier 'newfolder' et y extraira l'archive.

Notez que la barre oblique de fin n'est pas requise, mais je suppose que cela vient de la vieille habitude (j'utilise Debian et Ubuntu).

5
Jnnno

aunpack de atool le fera par défaut pour toutes sortes d'archives.

1
kralyk