解压缩目录中的所有文件

Len*_*ers 174 linux shell wildcard unzip

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

使用Ubuntu Linux服务器.

Chr*_*heD 347

根据这个链接,这适用于bash :

解压缩\*.zip

  • 不适合我.`unzip"*.zip"`确实工作了. (28认同)
  • 这样做时,我得到的文件名与目录中的所有 zip 文件都不匹配 (4认同)
  • 我需要 [Zsh](http://www.zsh.org/) 的反斜杠。如果您使用 Bash,我不知道您需要它的原因。 (2认同)
  • 重复文件会发生什么?我想它只会覆盖? (2认同)
  • 带引号的版本在 WSL 上对我有用。文件名中也有空格,FWIW。 (2认同)
  • 当您收到“文件名不匹配”时,只需将模式用单引号引起来:“unzip '*.zip'” (2认同)

gho*_*g74 88

只需输入一些引号来逃避通配符:

unzip "*.zip"
Run Code Online (Sandbox Code Playgroud)

  • +1这个为我工作。我必须解压缩具有特定格式的文件名,同时限制其余文件。我只是将匹配格式保留在双引号中,它的工作原理就像是魅力。输出告诉我成功处理的档案数量。 (2认同)
  • 我们如何将它们提取到具有各自名称的目录中? (2认同)

Ped*_*ito 56

使用zip文件的文件名将当前目录中的所有zip文件提取到新的dirs中.

例如,以下文件:

myfile1.zip
myfile2.zip 
Run Code Online (Sandbox Code Playgroud)

将被提取到:

./myfile1/files...
./myfile2/files...
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 这是征服一切的事情.不敢相信它不会更高 (4认同)

pha*_*ace 34

unzip*.zip,或者如果它们在子文件夹中,那么就像

find . -name "*.zip" -exec unzip {} \;
Run Code Online (Sandbox Code Playgroud)

  • 这将提取当前目录中的所有 zip 文件,如果我希望将 zip 文件(存在于子文件夹中)提取到相应的子文件夹中怎么办? (4认同)
  • 实际上这将完全符合预期,将查找操作的结果传递给解压缩 (3认同)
  • @RishabhAgrahari我在[新答案](/sf/answers/3489213801/)中回答了您的评论。 (2认同)

Jah*_*hid 15

for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done
Run Code Online (Sandbox Code Playgroud)

这会将所有zip存档解压缩到以zip存档的文件名命名的新文件夹中.

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


joj*_*ojo 9

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

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;
Run Code Online (Sandbox Code Playgroud)

这是@phatmanace的答案的延伸,并解决了@ RishabhAgrahari的评论:

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

  • 对于“gzip”文件,使用“gunzip -rfk .”在相应文件夹内递归解压缩 (2认同)
  • 获得`find:非法选项-使用** UnZip 6.00 **的n`-其他人吗? (2认同)
  • `找到。-name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;` 您忘记了目录列表。 (2认同)

kam*_*mpu 6

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


Anu*_*lia 5

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


小智 5

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

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done
Run Code Online (Sandbox Code Playgroud)


kaz*_*vac 5

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

find . -name '*.zip' -execdir unzip {} \; 
Run Code Online (Sandbox Code Playgroud)

摘自 find 的手册页

-execdir command ;
-execdir command {} +
Run Code Online (Sandbox Code Playgroud)

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