Find all zips, and unzip in place - Unix

I have been trying for some time and believe I am fairly close to this, but I am fairly new to Unix so have been finding this difficult.

I have a folder, containing many folders, some of which have zip files in them, some which don't. I am trying to unzip all of the zip files in any sub directories in place.

For example I have:





I would like to unzip them (assuming the zips contain just .java files), to have a result like: files/A/




I don't mind if the ZIP files remain or are deleted after unzipping, either is fine.

What I have tried so far.

  1. I expected I could use piping, which I am new to, like this:

     find . -name *.zip | unzip

    This doesn't work.

  2. I spent some time searching, the closest I got using a solution online is:

     find . -name '*.zip' -exec unzip '{}' ';'

    This unzips, but unzips them into the current working directory, I wanted them to unzip in place. I also don't understand this command which I would like to as I am trying to learn.


  • find . -name '*.zip' -exec sh -c 'unzip -d `dirname {}` {}' ';'

    This command looks in current directory and in its subdirectories recursively for files with names matching *.zip pattern. For file found it executes command sh with two parameters:



    unzip -d `dirname <filename>` <filename>

    Where <filename> is name of file that was found. Command sh is Unix shell interpreter. Option -c tells shell that next argument should be interpreted as shell script. So shell interprets the following script:

    unzip -d `dirname <filename>` <filename>

    Before running unzip shell expands the command, by doing various substitutions. In this particular example it substitutes

    `dirname <filename>`

    with output of command dirname <filename> which actually outputs directory name where file is placed. So, if file name is ./a/b/c/, shell will run unzip like this:

    unzip -d ./a/b/c ./a/b/c/

    In case you ZIP file names or directory names have spaces, use this:

    find . -name '*.zip' -exec sh -c 'unzip -d "`dirname \"{}\"`" "{}"' ';'