如何递归解压缩文件?

如何递归解压缩文件?

我有一个巨大的文件,其中包含 zip 和 rar,其中 zip 和 rar 文件位于 Linux 机器上。

我基本上需要一个脚本或单行代码,它将递归地搜索目录并解压缩和解压缩它找到的任何 rar 或 zip。

答案1

这是某人使用 shell 脚本解决此问题的方法。

http://www.dbforums.com/unix-shell-scripts/1619154-how-unzip-files-recursively.html

Linux 似乎没有递归解压缩选项:(

答案2

我能想到的唯一方法是使用 find 循环多次并执行一个脚本,在正确解压文件后将其删除。它必须多次遍历子目录,因此效率不高。 (预期的文件名在顶部以粗体显示)

递归解包

#!/bin/bash
if [ -d "$1" ]; then
   STARTDIR="$1"
else
   echo "starting dir not found: $1"
   exit
fi


COUNTER=1
while [ $COUNTER -gt 0 ]; do
   COUNTER=`find "$STARTDIR" -type f \( -iname '*.zip' -o -iname '*.rar' \) -exec ./unpacker \{\} \; | wc -l`
done

解包器

#!/bin/bash
BASENAME=`basename "$1"`
BASEDIR=`dirname "$1"`

cd "$BASEDIR"
EXT=`echo "$BASENAME" | awk -F . '{print $NF}'`

if [ "$EXT" = "zip" ]; then
  unzip -qq "$BASENAME"
  if [ $? -eq 0 ]; then
     echo "zip unpacked: $1"
     rm "$BASENAME"
  fi
fi

if [ "$EXT" = "rar" ]; then
  unrar e -y -c- -inul "$BASENAME"
  if [ $? -eq 0 ]; then
     echo "rar unpacked: $1"
     rm "$BASENAME"
  fi
fi

chmod u+x recursive_unpack
chmod u+x unpacker

调用它./recursive_unpack "/my/directory/containing/my/files"

  • recursive_unpack 期望解包程序位于同一目录中
  • unrar并且unzip需要安装
  • 如果找不到该目录,则会出现错误并退出
  • 不要删除解包器中的回显消息,它们用于检查是否存在要解包的文件以终止循环

答案3

一句快速的话,不会检查存档是否已被提取:

$ find . -name '*.rar' -execdir unrar e '{}' + && find . -name '*.zip' -execdir unzip -tq '{}' +

答案4

也许您会发现您有 rar 部分文件,并且您可能希望将它们与 *.rar 一起删除,为此您可以添加以下内容:

find "$BASENAME" -regex '.*\.r[0-9][0-9]' -delete

这里:

  if [ $? -eq 0 ]; then
     echo "rar unpacked: $1"
     rm "$BASENAME"
     # HERE
  fi

因此 bash 也会删除部分文件。

相关内容