bashgrepunrar

Scripting: get number of root files in RAR archive


I'm trying to write a bash script that determines whether a RAR archive has more than one root file.

The unrar command provides the following type of output if I run it with the v option:

[...@... 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%

and since RAR is proprietary I'm guessing this output is as close as I'll get.

If I can get just the file list part (the lines between ------), and then perhaps filter out all even lines or lines beginning with multiple spaces, then I could do num_root_files=$(list of files | cut -d'/' -f1 | uniq | wc -l) and see whether [ $num_root_files -gt 1 ].

How do I do this? Or is there a saner approach?

I have searched for and found ways to grep text between two words, but then I'd have to include those "words" in the command, and doing that with entire lines of dashes is just too ugly. I haven't been able to find any solutions for "grep text between lines beginning with".

What I need this for is to decide whether to create a new directory or not before extracting RAR archives. The unrar program does provide the x option to extract with full path and e for extracting everything to the current path, but I don't see how that could be useful in this case.


SOLUTION using the accepted answer:

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

which seems to be the same as the shorter:

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

OR using 7z as mentioned in a comment below:

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

Oh no... I didn't have a man page for unrar so I looked one up online, which seems to have lacked some options that I just discovered with unrar --help. Here's the real solution:

unrar vb "$file" | grep -c '^[^/]*$'

Solution

  • I haven't been able to find any solutions for "grep text between lines beginning with".

    In order to get the lines between ----, you can say:

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