我有一个巨大的文件,其中包含 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 也会删除部分文件。