How do you recursively unzip archives in a directory and its subdirectories from the Unix command-line?

recursion, spaces, unix, unzip

Solution

If you want to extract the files to the respective folder you can try this

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

A multi-processed version for systems that can handle high I/O:

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

Problem

The `unzip` command doesn't have an option for recursively unzipping archives. If I have the following directory structure and archives: ``` /Mother/Loving.zip /Scurvy/Sea Dogs.zip /Scurvy/Cures/Limes.zip ``` And I want to unzip all of the archives into directories with the same name as each 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 ``` What command or commands would I issue? It's important that this doesn't choke on filenames that have spaces in them.

Original source