Décompressez tous les fichiers d'un répertoire


203

J'ai un répertoire de fichiers ZIP (créé sur une machine Windows). Je peux les décompresser manuellement en utilisant unzip filename, mais comment puis-je décompresser tous les fichiers ZIP dans le dossier actuel via le shell?

Utilisation d'Ubuntu Linux Server.

Réponses:


395

Cela fonctionne en bash, selon ce lien :

décompressez \ *. zip


2
J'avais besoin de la barre oblique inverse avec Zsh . Je ne sais pas pourquoi vous en auriez besoin si vous utilisez Bash.
Don McCurdy

Que se passera-t-il avec les fichiers en double? Je suppose que ça va juste remplacer?
kerner1000

Fonctionne très bien sur macOS 😀
Ahi Tuna

1
En faisant cela, j'obtiens un nom de fichier qui ne correspond pas à tous les fichiers zip du répertoire
thebeancounter

1
La version avec guillemets a fonctionné pour moi sur WSL. Les noms de fichiers comportaient également des espaces, FWIW.
Max Candocia

107

Mettez simplement quelques citations pour échapper au caractère générique:

unzip "*.zip"

2
+1 Celui-ci a fonctionné pour moi. J'ai dû décompresser les noms de fichiers avec un format particulier tout en restreignant le reste. Je viens de garder le format correspondant entre guillemets doubles et cela a fonctionné comme un charme. La sortie m'indique le nombre d'archives traitées avec succès.
Lalit Kumar B

Fonctionnait magnifiquement sur le sous-système Ubuntu pour Windows, 18/11/2018. La meilleure réponse n'a pas fonctionné.
julianstanley

64

Le script bash suivant extrait tous les fichiers zip du répertoire courant dans de nouveaux répertoires avec le nom du fichier zip, c'est-à-dire:

Les fichiers suivants:

myfile1.zip
myfile2.zip 

Sera extrait vers:

./myfile1/files...
./myfile2/files...

Script shell:

#!/bin/sh
for zip in *.zip
do
  dirname=`echo $zip | sed 's/\.zip$//'`
  if mkdir "$dirname"
  then
    if cd "$dirname"
    then
      unzip ../"$zip"
      cd ..
      # rm -f $zip # Uncomment to delete the original zip file
    else
      echo "Could not unpack $zip - cd failed"
    fi
  else
    echo "Could not unpack $zip - mkdir failed"
  fi
done

4
C'est la chose pour vaincre toutes choses. Je ne peux pas croire qu'il ne soit pas voté plus haut
billynoah

Cela ne concerne pas les espaces dans les noms de fichiers.
David Oliver

1
Ajoutez simplement des guillemets "au nom de fichier
CONvid19

1
le `sauvé ma journée! Merci! Je fais une boucle, décompressez, effectuez une action, copiez, grepez quelque chose, supprimez. La chose qui manquait était de savoir comment passer de file.gz à fichier en tant que variable dans le script bash
thahgr

38

décompressez * .zip, ou s'ils sont dans des sous-dossiers, alors quelque chose comme

find . -name "*.zip" -exec unzip {} \;

décompresser fait un traitement générique donc un fichier appelé "* .zip" ne fera pas ce que vous attendez.
géocar

3
En fait, cela fera exactement ce qui est attendu, le résultat de l'opération de recherche est passé à décompresser
John Bargman

1
Cela va extraire tous les fichiers zip dans le répertoire actuel, que faire si je veux que les fichiers zip (présents dans les sous-dossiers) soient extraits dans les sous-dossiers respectifs?
Rishabh Agrahari

2
@RishabhAgrahari J'ai adressé votre commentaire dans une nouvelle réponse .
jojo

pour les gzip'edfichiers, utilisez gunzip -rfk .pour décompresser récursivement à l'intérieur des dossiers respectifs
Devaroop

17

Décompressez tous les .zipfichiers et stockez le contenu dans un nouveau dossier du même nom et dans le même dossier que le .zipfichier:

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

Ceci est une extension de la réponse de @ phatmanace et répond au commentaire de @ RishabhAgrahari :

Cela va extraire tous les fichiers zip dans le répertoire actuel, que faire si je veux que les fichiers zip (présents dans les sous-dossiers) soient extraits dans les sous-dossiers respectifs?


1
pour les gzip'edfichiers, utilisez gunzip -rfk .pour décompresser récursivement à l'intérieur des dossiers respectifs
Devaroop

2
Obtenir l' find: illegal option -- naide UnZip 6.00 - quelqu'un d' autre?
DannyDannyDanny

find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;Vous avez oublié la liste des répertoires.
SaundersB

16
for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done

Cela décompressera toutes les archives zip dans de nouveaux dossiers nommés avec les noms de fichiers des archives zip.

a.zip b.zip c.zipsera décompressé dans des a b cdossiers respectivement.


6

aunpack -e *.zip, avec atoolinstallé. A l'avantage de traiter intelligemment les erreurs et de décompresser toujours les sous-répertoires à moins que le zip ne contienne qu'un seul fichier. Ainsi, il n'y a aucun danger de polluer le répertoire courant avec des masses de fichiers, comme c'est le cas avec unzipun zip sans structure de répertoire.


6

Dans n'importe quel shell POSIX, cela se décompressera dans un répertoire différent pour chaque fichier zip:

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done

1
Ou en one-liner:for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
peterflynn

2

Utilisez ceci:

for file in `ls *.Zip`; do
unzip ${file} -d ${unzip_dir_loc}
done

2

for file in 'ls *.zip'; do unzip "${file}" -d "${file:0:-4}"; done


1
Super pour moi. Décompressez respectivement leurs sous-dossiers
insigne

Il est plus sûr de bien faire for file in *.zip; do ...?
peterflynn

1

Si les fichiers le sont gzip'd. Ensuite, utilisez simplement:

gunzip -rfk .

du répertoire racine pour extraire récursivement des fichiers dans les répertoires respectifs en conservant ceux d'origine (ou les supprimer -kpour les supprimer)


0

Ceci est une variante de la réponse de Pedro Lobito en utilisant comment parcourir un répertoire de manière récursive pour supprimer des fichiers avec certaines extensions :

shopt -s globstar
root_directory="."

for zip_file_name in **/*.{zip,sublime\-package}; do
    directory_name=`echo $zip_file_name | sed 's/\.\(zip\|sublime\-package\)$//'`
    printf "Unpacking zip file \`$root_directory/$zip_file_name\`...\n"

    if [ -f "$root_directory/$zip_file_name" ]; then
        mkdir -p "$root_directory/$directory_name"
        unzip -o -q "$root_directory/$zip_file_name" -d "$directory_name"

        # Some files have the executable flag and were not being deleted because of it.
        # chmod -x "$root_directory/$zip_file_name"
        # rm -f "$root_directory/$zip_file_name"
    fi
done

-2
for i in `ls *.zip`; do unzip $i; done

14
Utilisation dangereuse de ls. Et si vous avez un fichier appelé "-j -o -d .. jackass.zip"
geocar


-3

Utilisation

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

décompresser un dossier sous linux


Cela ne décompressera qu'un seul fichier. La question est de décompresser tous les dossiers
Vivek Panday

Pour être juste, le titre "Décompressez tous les fichiers dans un répertoire" pourrait être ambigu et signifier également "Décompresser une seule archive dans un répertoire séparé".
jdersen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.