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.

Lennie De Villiers
la source

Réponses:

395

Cela fonctionne en bash, selon ce lien :

décompressez \ *. zip

ChristopheD
la source
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"
ghostdog74
la source
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
CONvid19
la source
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 {} \;
phatmanace
la source
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?

jojo
la source
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.

Jahid
la source
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.

kampu
la source
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
Jeff Fisher
la source
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
Ankit Malhotra
la source
2

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

Anurag Dalia
la source
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)

Devaroop
la source
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
utilisateur
la source
-2
for i in `ls *.zip`; do unzip $i; done
Dominik
la source
14
Utilisation dangereuse de ls. Et si vous avez un fichier appelé "-j -o -d .. jackass.zip"
geocar
-2

Pour décompresser tous les fichiers d'un répertoire, tapez simplement cette cmd dans le terminal:

unzip '*.zip'
Yacine ELgoub
la source
cette réponse est un doublon de stackoverflow.com/a/2376135/6948900
Mikhail Antonov
-3

Utilisation

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

décompresser un dossier sous linux

Mohit Singh
la source
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