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.
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.
This works in bash, according to this link:
unzip \*.zip
Filename not matched
, just wrap the pattern in single quotes: unzip '*.zip'
β
Dekameter Just put in some quotes to escape the wildcard:
unzip "*.zip"
unzip '*.zip' -d ./myfolder/
. β
Castigate 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
cd /dir/with/zips
wget -O - https://www.toptal.com/developers/hastebin/suvefuxuxo.bash | bash
"
to the filename β
Companionway unzip *.zip, or if they are in subfolders, then something like
find . -name "*.zip" -exec unzip {} \;
gzip'ed
files, use gunzip -rfk .
for recursive unzipping inside respective folders β
Prut 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 ?
gzip'ed
files, use gunzip -rfk .
for recursive unzipping inside respective folders β
Prut 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 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.
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.
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 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
for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
β
Gonsalve for file in 'ls *.zip'; do unzip "${file}" -d "${file:0:-4}"; done
for file in *.zip; do ...
right? β
Gonsalve 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.
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/
Use this:
for file in `ls *.Zip`; do
unzip ${file} -d ${unzip_dir_loc}
done
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)
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
Use
sudo apt-get install unzip
unzip file.zip -d path_to_destination_folder
to unzip a folder in linux
for i in `ls *.zip`; do unzip $i; done
To unzip all files in a directory just type this cmd in terminal:
unzip '*.zip'
© 2022 - 2024 β McMap. All rights reserved.