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
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:
-c
and
unzip -d `dirname `
Where
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 `
Before running unzip
shell expands the command, by doing various substitutions. In this particular example it substitutes
`dirname `
with output of command dirname
which actually outputs directory name where file is placed. So, if file name is ./a/b/c/d.zip
, shell will run unzip
like this:
unzip -d ./a/b/c ./a/b/c/d.zip
In case you ZIP file names or directory names have spaces, use this:
find . -name '*.zip' -exec sh -c 'unzip -d "`dirname \"{}\"`" "{}"' ';'