我正在尝试编写一个 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 '^[^/]*$'