261

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

使用 Ubuntu Linux 服务器。

4

16 回答 16

496

根据此链接,这在 bash 中有效:

解压\*.zip

于 2010-03-03T20:45:45.650 回答
143

只需添加一些引号即可转义通配符:

unzip "*.zip"
于 2010-03-04T00:43:24.817 回答
98

以下 bash 脚本将当前目录中的所有 zip 文件提取到具有 zip 文件文件名的新目录中,即:

以下文件:

myfile1.zip
myfile2.zip 

将被提取到:

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

外壳脚本:

#!/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
于 2015-03-25T06:21:39.070 回答
46

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

find . -name "*.zip" -exec unzip {} \;
于 2010-03-03T20:46:17.983 回答
29

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

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

这是@phatmanace 的答案的扩展,并解决了@RishabhAgrahari 的评论

这将提取当前目录中的所有 zip 文件,如果我希望将 zip 文件(存在于子文件夹中)提取到相应的子文件夹中怎么办?

于 2018-04-15T19:25:12.437 回答
21
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文件夹中。

于 2015-04-28T12:53:15.903 回答
7

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

于 2013-05-24T07:59:39.807 回答
7

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

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done
于 2018-04-16T12:02:32.193 回答
5

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

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

摘自 find 的手册页

-execdir command ;
-execdir command {} +

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

于 2020-08-12T19:54:49.970 回答
3

用这个:

for file in `ls *.Zip`; do
unzip ${file} -d ${unzip_dir_loc}
done
于 2015-02-13T21:59:40.000 回答
2

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

于 2017-09-02T11:10:06.487 回答
1

如果文件是gzip'd. 然后只需使用:

gunzip -rfk .

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

于 2019-03-13T09:48:24.060 回答
0

这是Pedro Lobito 答案的变体,使用如何递归地遍历目录以删除具有某些扩展名的文件教学:

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
于 2018-02-15T06:13:13.970 回答
-1

采用

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

在linux中解压文件夹

于 2015-04-21T08:38:47.627 回答
-2
for i in `ls *.zip`; do unzip $i; done
于 2010-03-03T20:45:02.407 回答
-3

要解压缩目录中的所有文件,只需在终端中键入此 cmd:

unzip '*.zip'
于 2018-03-08T10:28:17.393 回答