脚本:获取 RAR 压缩包中根文件的数量

问题描述 投票:0回答:2

我正在尝试编写一个 bash 脚本来确定 RAR 存档是否具有多个根文件。

如果我使用

v
选项运行 unrar 命令,它会提供以下类型的输出:

[...@... dir]$ unrar v my_archive.rar

UNRAR 4.20 freeware      Copyright (c) 1993-2012 Alexander Roshal

Archive my_archive.rar

Pathname/Comment
              Size   Packed Ratio  Date   Time     Attr      CRC   Meth Ver
-------------------------------------------------------------------------------
file1.foo
           2208411  2037283  92% 08-08-08 08:08  .....A.   00000000 m3g 2.9
file2.bar
               103      103 100% 08-08-08 08:08  .....A.   00000000 m0g 2.9
baz/file3.qux
           9911403  9003011  90% 08-08-08 08:08  .....A.   00000000 m3g 2.9
-------------------------------------------------------------------------------
3         12119917 11040397  91%

由于 RAR 是专有的,我猜这个输出与我所能得到的最接近。

如果我只能获取文件列表部分(

------
之间的行),然后过滤掉所有偶数行或以多个空格开头的行,那么我可以执行
num_root_files=$(list of files | cut -d'/' -f1 | uniq | wc -l)
并查看是否
[ $num_root_files -gt 1 ]

我该怎么做?或者有更明智的方法吗?

我已经搜索并找到了在两个单词之间 grep 文本的方法,但随后我必须在命令中包含这些“单词”,而使用整行破折号来执行此操作太难看了。我一直无法找到“grep 开头的行之间的文本”的任何解决方案。

我需要这个的目的是在提取 RAR 档案之前决定是否创建一个新目录。

unrar
程序确实提供了
x
选项来提取完整路径,并提供
e
用于将所有内容提取到当前路径,但我不知道这在这种情况下有什么用处。


解决方案使用已接受的答案:

num_root_files=$(unrar v "$file" | sed -n '/^----/,/^----/{/^----/!p}' | grep -v '^  ' | cut -d'/' -f1 | uniq | wc -l)

这似乎与较短的相同:

num_root_files=$(unrar v "$file" | sed -n '/^----/,/^----/{/^----/!p}' | grep -v '^  ' | grep -c '^ *[^/]*$')

OR 使用

7z
,如下面评论中所述:

num_root_files=$(7z l -slt "$file" | grep -c 'Path = [^/]*$')
# check if value is gt 2 rather than gt 1 - the archive itself is also listed

哦不...我没有

unrar
的手册页,所以我在网上查找了一个,它似乎缺少我刚刚通过
unrar --help
发现的一些选项。这是真正的解决方案

unrar vb "$file" | grep -c '^[^/]*$'
bash grep unrar
2个回答
2
投票

我还没有找到任何“grep 行间文本”的解决方案 以“开头。

为了获得

----
之间的线,你可以说:

unrar v my_archive.rar | sed -n '/^----/,/^----/{/^----/!p}'

0
投票

“rar v arcname.rar”在最后一个输出行中列出了存档中的文件总数。您可以添加 -idn 开关以从列表中删除文件名。

© www.soinside.com 2019 - 2024. All rights reserved.