解压缩目录中的所有文件

我有一个ZIP文件目录(在Windows机器上创建的)。我可以使用unzip filename手动解压缩它们,但我如何通过shell解压缩当前文件夹中的所有ZIP文件?

使用Ubuntu Linux服务器。

284723 次浏览
for i in `ls *.zip`; do unzip $i; done

这在bash中工作,根据这个链接:

解压缩\ * . zip

解压缩*.zip,或者如果它们在子文件夹中,那么类似于

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

只需输入一些引号来转义通配符:

unzip "*.zip"

aunpack -e *.zip,已安装atool。 具有智能地处理错误的优点,并且总是解包到子目录中,除非zip只包含一个文件。因此,不会有大量文件污染当前目录的危险,就像在没有目录结构的zip文件中使用unzip那样

用这个:

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

下面的shell脚本将当前目录中的所有zip文件提取到新的dirs中,并以zip文件的文件名命名,即:

以下文件:

myfile1.zip
myfile2.zip

将被提取到:

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

Shell脚本:

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

使用

sudo apt-get install unzip


unzip file.zip -d path_to_destination_folder

在Linux中解压缩一个文件夹

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

这将把所有zip归档解压缩到以zip归档的文件名命名的新文件夹中。

a.zip b.zip c.zip将分别解压到a b c文件夹中。

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

这是使用如何循环通过一个目录递归删除具有某些扩展名的文件教学的佩德罗·洛比托 回答的一个变体:

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

要解压缩目录中的所有文件,只需在终端中键入以下命令:

unzip '*.zip'

解压缩所有.zip文件,并将内容存储在与.zip文件同名的新文件夹中:

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

这是@phatmanace's answer和地址@RishabhAgrahari's comment的扩展:

这将在当前目录中提取所有的zip文件,如果我想在各自的子文件夹中提取zip文件(目前在子文件夹中)怎么办?

在任何POSIX shell中,这将为每个zip文件解压缩到不同的目录:

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

如果文件是gzip'd。然后使用:

gunzip -rfk .

从根目录中递归地提取各自目录中的文件,通过保留原始文件(或删除-k来删除它们)

如果你所说的“当前目录”是指zip文件所在的目录,那么我将使用以下命令:

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

摘录自find的手册页

-execdir command ;
-execdir command {} +

类似于-exec,但是指定的命令是从包含匹配文件的子目录中运行的,该子目录通常不是您开始查找的目录。这是调用命令的一种更安全的方法,因为它避免了在解析匹配文件的路径时出现竞争条件。与-exec选项一样,-execdir的'+'形式将构建一个命令行来处理多个匹配的文件,但任何给定的命令调用将只列出存在于同一子目录中的文件。如果你使用这个选项,你必须确保你的$PATH环境变量没有引用当前目录;否则,攻击者可以通过在您将运行-execdir的目录中留下适当命名的文件来运行他们喜欢的任何命令。

这里有一个没有使用ls的一行程序,它为文件创建了带有zip名称的文件夹。它适用于当前目录中的任何zip。

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

你可以把它添加到你的.bashrc

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

灵感源自:

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