RAR アーカイブに複数のルート ファイルがあるかどうかを判断する bash スクリプトを作成しようとしています。
オプションを指定して unrar コマンドを実行すると、次のタイプの出力が得られv
ます。
[...@... 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 ]
.
どうすればいいですか?または、より健全なアプローチはありますか?
2つの単語の間のテキストを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 '^[^/]*$'