Unzip All Files In A Directory
Asked Answered
E

17

300

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.

Early answered 3/3, 2010 at 20:41 Comment(1)
for windows in powershell: Get-ChildItem 'path to folder' -Filter *.zip | Expand-Archive -DestinationPath 'path to extract' -Force – Warship
D
557

This works in bash, according to this link:

unzip \*.zip

Daub answered 3/3, 2010 at 20:45 Comment(7)
I needed the backslash with Zsh. I don't know of a reason you'd need it if you're using Bash. – Rupe
What will happen with duplicate files? I guess it will just override? – Abolish
Works great on macOS πŸ˜€ – Kare
Worked for me in zsh – Brine
When doing this I get filename not matched for all the zip files in the directory – Shockey
The version with quotes worked for me on WSL. The filenames also had spaces in them, FWIW. – Lingulate
When you get the Filename not matched, just wrap the pattern in single quotes: unzip '*.zip' – Dekameter
G
170

Just put in some quotes to escape the wildcard:

unzip "*.zip"
Gensler answered 4/3, 2010 at 0:43 Comment(4)
+1 This one worked for me. I had to unzip filenames with a particular format while restricting the rest. I just kept the matching format within double quotes and it worked like charm. Output tells me the number of archives successfully processed. – Ariminum
Worked beautifully on Ubuntu for Windows subsystem, 11/18/2018. Top answer didn't work. – Suckle
how can we extract them in directories with their respective names? – Octans
It is important to use quotes or single quotes. Sample: unzip '*.zip' -d ./myfolder/. – Castigate
C
118

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/suvefuxuxo.bash | bash
Companionway answered 25/3, 2015 at 6:21 Comment(6)
This is the thing to conquer all things. Can't believe it's not voted higher – Award
This doesn't deal with spaces in filenames. – Toothy
Just add quotes " to the filename – Companionway
the ` saved my day! thanks! I am doing some loop, unzip, perform an action, copy, grep something, remove. The thing missing was how to go from file.gz to file as a variable in the bash script – Pyridine
This should be the ultimate answer to all unzipping anywhere and anytime, why is this not the accepted answer? :) – Aha
This is a more complex version of j-i-l's answer. Just use the -d flag from unzip and shell string manipulation for the folder name – Suckling
C
50

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

find . -name "*.zip" -exec unzip {} \;
Covin answered 3/3, 2010 at 20:46 Comment(5)
unzip does wildcard processing so a file called "*.zip" won't do what you expect. – Nondescript
Actually this will do exactly what is expected, the result of the find operation is being passed to unzip – Br
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 ? – Hejaz
@RishabhAgrahari I addressed your comment in a new answer. – Gina
for gzip'ed files, use gunzip -rfk . for recursive unzipping inside respective folders – Prut
G
49

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 ?

Gina answered 15/4, 2018 at 19:25 Comment(4)
for gzip'ed files, use gunzip -rfk . for recursive unzipping inside respective folders – Prut
Getting find: illegal option -- n using UnZip 6.00 - anybody else? – Footwork
find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \; You forgot the directory listing. – Inhabiter
this worked for me, above script / solutions dont. – Jorgan
T
23
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.

Taler answered 28/4, 2015 at 12:53 Comment(1)
This one worked for my use case, needs more up votes. The other approaches do not place the extracted files in a folder of the same name, as expected, but there are some cases where using this approach to separate the folders will be needed. – Atreus
N
8

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.

Notional answered 24/5, 2013 at 7:59 Comment(2)
aunpack -e -D *.zip if you want each zip to get its own output dir regardless of the number of files in it (similar to default behavior of ExtractAll in Windows) – Schwerin
This is perfect. – Jakob
L
8

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
Laniary answered 16/4, 2018 at 12:2 Comment(1)
Or as a one-liner: for file in *.zip; do unzip "$file" -d "${file%.zip}"; done – Gonsalve
L
5

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

Lum answered 2/9, 2017 at 11:10 Comment(2)
Great to me. Unzip in their subfolders respectively – Laud
It's safer to just do for file in *.zip; do ... right? – Gonsalve
B
5

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.

Bowling answered 12/8, 2020 at 19:54 Comment(0)
C
4

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/

Cupellation answered 2/4, 2022 at 16:36 Comment(0)
C
3

Use this:

for file in `ls *.Zip`; do
unzip ${file} -d ${unzip_dir_loc}
done
Chemoreceptor answered 13/2, 2015 at 21:59 Comment(0)
P
1

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)

Prut answered 13/3, 2019 at 9:48 Comment(0)
A
0

This is a variant of Pedro Lobito answer using How to loop through a directory recursively to delete files with certain extensions 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
Amygdaloid answered 15/2, 2018 at 6:13 Comment(0)
N
-1

Use

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

to unzip a folder in linux

Nitrate answered 21/4, 2015 at 8:38 Comment(2)
This will only unzip single file. Question is to unzip all folders – Nightfall
To be fair, the title "Unzip All Files In A Directory" could be ambiguous and also mean to "Unzip a single archive into a separate directory". – Kohler
A
-2
for i in `ls *.zip`; do unzip $i; done
Algol answered 3/3, 2010 at 20:45 Comment(1)
Dangerous use of ls. What if you have a file called "-j -o -d .. jackass.zip" – Nondescript
D
-3

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

unzip '*.zip'
Dinge answered 8/3, 2018 at 10:28 Comment(1)
this answer is a duplicate of https://mcmap.net/q/99723/-unzip-all-files-in-a-directory – Pritchett

© 2022 - 2024 β€” McMap. All rights reserved.