Unzip All Files In A Directory

LinuxShellWildcardUnzip

Linux Problem Overview


I have a directory of ZIP files (created on a Windows machine). I can manually unzip them using unzip filename, but how can I unzip all the ZIP files in the current folder via the shell?

Using Ubuntu Linux Server.

Linux Solutions


Solution 1 - Linux

This works in bash, according to this link:

> unzip \*.zip

Solution 2 - Linux

Just put in some quotes to escape the wildcard:

unzip "*.zip"

Solution 3 - Linux

The shell script below extracts all zip files in the current directory into new dirs with the filename of the zip file, i.e.:

The following files:

myfile1.zip
myfile2.zip 

Will be extracted to:

./myfile1/files...
./myfile2/files...

Shell script:

#!/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

Source Gist


Usage:

cd /dir/with/zips
wget -O - https://www.toptal.com/developers/hastebin/raw/boyoxajowi | bash

Solution 4 - Linux

unzip *.zip, or if they are in subfolders, then something like

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

Solution 5 - Linux

Unzip all .zip files and store the content in a new folder with the same name and in the same folder as the .zip file:

find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

This is an extension of @phatmanace's answer and addresses @RishabhAgrahari's comment:

> This will extract all the zip files in current directory, what if I want the zip files (present in subfolders) to be extracted in the respective subfolders ?

Solution 6 - Linux

for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done

This will unzip all the zip archives into new folders named with the filenames of the zip archives.

a.zip b.zip c.zip will be unzipped into a b c folders respectively.

Solution 7 - Linux

aunpack -e *.zip, with atool installed. Has the advantage that it deals intelligently with errors, and always unpacks into subdirectories unless the zip contains only one file . Thus, there is no danger of polluting the current directory with masses of files, as there is with unzip on a zip with no directory structure.

Solution 8 - Linux

In any POSIX shell, this will unzip into a different directory for each zip file:

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done

Solution 9 - Linux

If by 'current directory' you mean the directory in which the zip file is, then I would use this command:

find . -name '*.zip' -execdir unzip {} \; 

excerpt from find's man page

-execdir command ;
-execdir command {} +

> Like -exec, but the specified command is run from the subdirectory containing the matched file, which is not normally the directory in which you started find. This a much more secure method for invoking commands, as it avoids race conditions during resolution of the paths to the matched files. As with the -exec option, the '+' form of -execdir will build a command line to process more than one matched file, but any given invocation of command will only list files that exist in the same subdirectory. If you use this option, you must ensure that your $PATH environment variable does not reference the current directory; otherwise, an attacker can run any commands they like by leaving an appropriately-named file in a directory in which you will run -execdir.

Solution 10 - Linux

Use this:

for file in `ls *.Zip`; do
unzip ${file} -d ${unzip_dir_loc}
done

Solution 11 - Linux

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

Solution 12 - Linux

Here is a one liner without using ls that creates folders with the zip names for the files. It works for any zips in the current directory.

for z in *.zip; do unzip "$z" -d "${z%".zip"}"; done

You can add it to your .bashrc

alias unzip_all='for z in *.zip; do unzip "$z" -d "${z%".zip"}"; done'

Inspiration taken from:

Method #2: Unzipping Multiple Files from Linux Command Line Using Shell For Loop (Long Version) in https://www.cyberciti.biz/faq/linux-unix-shell-unzipping-many-zip-files/

Solution 13 - Linux

If the files are gzip'd. Then just use:

gunzip -rfk .

from the root directory to recursively extract files in respective directories by keeping the original ones (or remove -k to delete them)

Solution 14 - Linux

This is a variant of Pedro Lobito answer using https://stackoverflow.com/questions/4638874/how-to-loop-through-a-directory-recursively-to-delete-files-with-certain-extensi teachings:

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

Solution 15 - Linux

Use

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

to unzip a folder in linux

Solution 16 - Linux

for i in `ls *.zip`; do unzip $i; done

Solution 17 - Linux

To unzip all files in a directory just type this cmd in terminal:

unzip '*.zip'

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLennie De VilliersView Question on Stackoverflow
Solution 1 - LinuxChristopheDView Answer on Stackoverflow
Solution 2 - Linuxghostdog74View Answer on Stackoverflow
Solution 3 - LinuxPedro LobitoView Answer on Stackoverflow
Solution 4 - LinuxphatmanaceView Answer on Stackoverflow
Solution 5 - LinuxjojoView Answer on Stackoverflow
Solution 6 - LinuxJahidView Answer on Stackoverflow
Solution 7 - LinuxkampuView Answer on Stackoverflow
Solution 8 - LinuxJeff FisherView Answer on Stackoverflow
Solution 9 - LinuxkaznovacView Answer on Stackoverflow
Solution 10 - LinuxAnkit MalhotraView Answer on Stackoverflow
Solution 11 - LinuxAnurag DaliaView Answer on Stackoverflow
Solution 12 - LinuxdylanmorrollView Answer on Stackoverflow
Solution 13 - LinuxDevaroopView Answer on Stackoverflow
Solution 14 - LinuxuserView Answer on Stackoverflow
Solution 15 - LinuxMohit SinghView Answer on Stackoverflow
Solution 16 - LinuxDominikView Answer on Stackoverflow
Solution 17 - LinuxYacine ELgoubView Answer on Stackoverflow