【问题标题】:Unzip All Files In A Directory解压目录中的所有文件
【发布时间】:2011-01-23 09:42:25
【问题描述】:

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

使用 Ubuntu Linux 服务器。

【问题讨论】:

  • 对于 powershell 中的 windows:Get-ChildItem 'path to folder' -Filter *.zip | Expand-Archive -DestinationPath '提取路径' -Force

标签: linux shell wildcard unzip


【解决方案1】:

根据this link,这在 bash 中有效:

解压缩\*.zip

【讨论】:

  • 我需要带有Zsh 的反斜杠。如果您使用 Bash,我不知道您需要它的原因。
  • 重复文件会怎样?我猜它会覆盖?
  • 执行此操作时,我得到目录中所有 zip 文件的文件名不匹配
  • 带引号的版本在 WSL 上对我有用。文件名中也有空格,FWIW。
  • 当你得到Filename not matched时,只需将模式用单引号括起来:unzip '*.zip'
【解决方案2】:

只需加上一些引号来转义通配符:

unzip "*.zip"

【讨论】:

  • +1 这个对我有用。我必须以特定格式解压缩文件名,同时限制其余文件名。我只是将匹配的格式保留在双引号内,它就像魅力一样。输出告诉我成功处理的档案数量。
  • 在 Ubuntu for Windows 子系统上完美运行,2018 年 11 月 18 日。最佳答案无效。
  • 我们如何将它们提取到具有各自名称的目录中?
【解决方案3】:

以下 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

【讨论】:

  • 这就是征服一切的东西。不敢相信它的票数不高
  • 这不处理文件名中的空格。
  • 只需在文件名中添加引号"
  • `拯救了我的一天!谢谢!我正在做一些循环、解压缩、执行操作、复制、grep 某些东西、删除。缺少的东西是如何从 file.gz 到文件作为 bash 脚本中的变量
  • 这应该是所有随时随地解压的终极答案,为什么这不是公认的答案? :)
【解决方案4】:

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

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

【讨论】:

  • unzip 会进行通配符处理,因此名为“*.zip”的文件不会按照您的预期进行。
  • 实际上这将完全符合预期,将查找操作的结果传递给解压缩
  • 这将提取当前目录中的所有 zip 文件,如果我希望将 zip 文件(存在于子文件夹中)提取到相应的子文件夹中怎么办?
  • @RishabhAgrahari 我在a new answer 中处理了您的评论。
  • 对于gzip'ed文件,使用gunzip -rfk .在各个文件夹内递归解压
【解决方案5】:

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

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

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

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

【讨论】:

  • 对于gzip'ed文件,使用gunzip -rfk .在各个文件夹内递归解压
  • 使用 UnZip 6.00 获取 find: illegal option -- n - 还有其他人吗?
  • find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \; 您忘记了目录列表。
【解决方案6】:
for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done

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

a.zipb.zipc.zip将分别解压到abc文件夹中。

【讨论】:

  • 这个适用于我的用例,需要更多赞成票。其他方法不会像预期的那样将提取的文件放在同名文件夹中,但在某些情况下需要使用这种方法来分隔文件夹。
【解决方案7】:

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

【讨论】:

  • aunpack -e -D *.zip 如果您希望每个 zip 获得自己的输出目录,而不管其中的文件数量如何(类似于 Windows 中 ExtractAll 的默认行为)
【解决方案8】:

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

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

【讨论】:

  • 或单线:for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
【解决方案9】:

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

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

摘自 find 的man page

-execdir command ;
-execdir command {} +

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

【讨论】:

    【解决方案10】:

    使用这个:

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

    【讨论】:

      【解决方案11】:

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

      【讨论】:

      • 对我来说太好了。分别解压到它们的子文件夹中
      • 只做for file in *.zip; do ...更安全吧?
      【解决方案12】:

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

      gunzip -rfk .
      

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

      【讨论】:

        【解决方案13】:

        这是Pedro Lobitoanswer的变体,使用How to loop through a directory recursively to delete files with certain extensions教义:

        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
        

        【讨论】:

          【解决方案14】:

          使用

          sudo apt-get install unzip 
          
          unzip file.zip -d path_to_destination_folder
          

          在linux中解压文件夹

          【讨论】:

          • 这只会解压缩单个文件。问题是解压缩所有文件夹
          • 公平地说,“解压缩目录中的所有文件”的标题可能有歧义,也意味着“将单个存档解压缩到单独的目录中”。
          【解决方案15】:
          for i in `ls *.zip`; do unzip $i; done
          

          【讨论】:

          • 危险使用 ls。如果您有一个名为“-j -o -d .. jackass.zip”的文件,该怎么办
          【解决方案16】:

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

          unzip '*.zip'
          

          【讨论】:

          猜你喜欢
          • 2017-01-06
          • 2020-12-18
          • 2020-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-12
          • 2015-06-11
          相关资源
          最近更新 更多