Я пытаюсь написать сценарий 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 '^[^/]*$'
'7z' может перечислить содержимое некоторых' rar' файлов с 'L' переключателя и его выход, кажется, лучше структурированный. – Birei
D'oh, у меня уже было решение для файлов 'zip', используя это! Вопрос в том, что означает «некоторые« файлы rar »? – Toerndev