脚本:获取RAR存档中的根文件数

时间:2013-09-17 11:58:04

标签: bash grep unrar

我正在尝试编写一个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 '^ *[^/]*$')
使用下面评论中提到的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 '^[^/]*$'

1 个答案:

答案 0 :(得分:2)

  

我无法找到“行之间的grep文本”的任何解决方案   从“。

开始

为了在 ----之间获取行,您可以说:

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