2013-09-17 2 views
1

Я пытаюсь написать сценарий bash, который определяет, имеет ли RAR-архив более одного корневого файла.Scripting: получить количество корневых файлов в архиве RAR

UnRAR команда предоставляет следующий тип вывода, если я запустить его с опцией v:

[[email protected] 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 text между строками, начинающимися с».

Для этого мне нужно решить, нужно ли создавать новый каталог или нет, прежде чем извлекать 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

'7z' может перечислить содержимое некоторых' rar' файлов с 'L' переключателя и его выход, кажется, лучше структурированный. – Birei

+0

D'oh, у меня уже было решение для файлов 'zip', используя это! Вопрос в том, что означает «некоторые« файлы rar »? – Toerndev

ответ

2

Я не смог найти какие-либо решения «Grep текста между строками , начиная с».

Для того, чтобы получить линии между , вы можете сказать:

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

Спасибо! Понимаю. Это работает для первой части.Можно ли добавить что-то, что также удаляет строки с размером файла, timestamp et c? – Toerndev

+0

@gaidal Я предполагаю, что это строки, начинающиеся с пробела. Если это так, добавьте '| grep -v "^" 'к указанной команде. – devnull

+0

Да, или с двумя пробелами, так как есть один перед именами файлов. Я думаю, это невозможно или удобно добавить его к линии sed тогда. Спасибо! – Toerndev

Смежные вопросы