93 votes

Comment décompresser récursivement des archives dans un répertoire et ses sous-répertoires à partir de la ligne de commande Unix ?

Les unzip n'a pas d'option pour décompresser récursivement les archives.

Si j'ai la structure de répertoire et les archives suivantes :

/Mother/Loving.zip
/Scurvy/Sea Dogs.zip
/Scurvy/Cures/Limes.zip

Et je veux décompresser toutes les archives dans des répertoires portant le même nom que chaque archive :

/Mother/Loving/1.txt
/Mother/Loving.zip
/Scurvy/Sea Dogs/2.txt
/Scurvy/Sea Dogs.zip
/Scurvy/Cures/Limes/3.txt
/Scurvy/Cures/Limes.zip

Quel(s) ordre(s) devrais-je donner ?

Il est important que cela ne s'arrête pas aux noms de fichiers contenant des espaces.

163voto

Vivek Thomas Points 71

Si vous souhaitez extraire les fichiers dans leur dossier respectif, vous pouvez essayer ceci

find . -name "*.zip" | while read filename; do unzip -o -d "`dirname "$filename"`" "$filename"; done;

Une version multiprocessus pour les systèmes capables de gérer un grand nombre d'E/S :

find . -name "*.zip" | xargs -P 5 -I fileName sh -c 'unzip -o -d "$(dirname "fileName")/$(basename -s .zip "fileName")" "fileName"'

54voto

robinst Points 9249

Une solution qui traite correctement tous les noms de fichiers (y compris les nouvelles lignes) et qui extrait les données dans un répertoire situé au même endroit que le fichier, mais dont l'extension a été supprimée :

find . -iname '*.zip' -exec sh -c 'unzip -o -d "${0%.*}" "$0"' '{}' ';'

Notez que vous pouvez facilement faire en sorte qu'il gère plus de types de fichiers (tels que .jar ) en les ajoutant à l'aide de -o , par exemple :

find . '(' -iname '*.zip' -o -iname '*.jar' ')' -exec ...

40voto

Clay Nichols Points 1299

Voici une solution qui permet d'extraire tous les fichiers zip dans le répertoire répertoire de travail et fait appel à la commande find et à une boucle while :

find . -name "*.zip" | while read filename; do unzip -o -d "`basename -s .zip "$filename"`" "$filename"; done;

4voto

Mark L Points 133

Vous pouvez utiliser find avec l'option -exec dans une seule ligne de commande pour faire le travail

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

4voto

Prabhav Points 397

Cela fonctionne parfaitement comme nous le souhaitons :

Décompresser les fichiers :

find . -name "*.zip" | xargs -P 5 -I FILENAME sh -c 'unzip -o -d "$(dirname "FILENAME")" "FILENAME"'

La commande ci-dessus ne crée pas de répertoires en double.

Supprimer tous les fichiers zip :

find . -depth -name '*.zip' -exec rm {} \;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X