解压缩目录中的所有文件


202

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

使用Ubuntu Linux服务器。

Answers:


394

根据以下链接,这可以在bash中运行:

解压缩\ *。zip


2
我需要使用Zsh进行反斜杠。我不知道使用Bash时会需要它的原因。
Don McCurdy 2015年

重复文件会发生什么?我想它会覆盖吗?
kerner1000

在macOS上工作出色
Ahi Tuna

1
这样做时,我得到的文件名与目录中的所有zip文件都不匹配
thebeancounter

1
带引号的版本适用于WSL。文件名中也有空格FWIW。
Max Candocia

107

只需加上一些引号即可避免使用通配符:

unzip "*.zip"

2
+1这个为我工作。我必须解压缩具有特定格式的文件名,同时限制其余文件名。我只是将匹配的格式放在双引号中,它的工作原理就像是魅力。输出告诉我成功处理的档案数量。
Lalit Kumar B

在适用于Windows子系统的Ubuntu(11/18/2018)上完美工作。最佳答案无效。
julianstanley

64

以下bash脚本使用该zip文件的文件名将当前目录中的所有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

4
这是征服万物的东西。不敢相信它没有获得更高的投票
Billynoah

这不处理文件名中的空格。
大卫·奥利弗

1
只需"在文件名中加上引号即可
CONvid19

1
`挽救了我的一天!谢谢!我正在做一些循环,解压缩,执行操作,复制,grep某些内容,删除。缺少的是如何在bash脚本中从file.gz转到文件作为变量
thahgr

38

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

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

解压缩会执行通配符处理,因此名为“ * .zip”的文件将无法满足您的期望。
geocar'Mar

3
实际上,这将完全符合预期,find操作的结果将传递给解压缩
John Bargman 2015年

1
这将提取当前目录中的所有zip文件,如果我希望将zip文件(存在于子文件夹中)提取到各个子文件夹中怎么办?
瑞沙·阿格哈里(Rishabh Agrahari)'18年

2
@RishabhAgrahari我在一个新答案中回答了您的评论。
jojo

用于gzip'ed文件,gunzip -rfk .用于在相应文件夹内递归解压缩
Devaroop

17

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

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

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

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


1
用于gzip'ed文件,gunzip -rfk .用于在相应文件夹内递归解压缩
Devaroop

2
开始find: illegal option -- n使用UnZip 6.00-其他人吗?
DannyDannyDanny19年

find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;您忘记了目录清单。
SaundersB

16
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文件夹中。


6

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


6

在任何POSIX Shell中,这将为每个zip文件解压缩到另一个目录中:

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

1
还是for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
单线



1

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

gunzip -rfk .

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


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

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

14
ls的危险使用。如果您有一个名为“ -j -o -d .. jackass.zip”的文件,怎么办?
geocar 2010年


-3

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

在Linux中解压缩文件夹


这只会解压缩单个文件。问题是解压缩所有文件夹
Vivek Panday

公平地说,标题为“解压缩目录中的所有文件” 可能是模棱两可的,也意味着“将单个存档解压缩到单独的目录中”。
jdersen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.