1

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プログラムは、フルパスで抽出するオプションと、すべてを現在のパスに抽出するオプションを提供しますxe、この場合にそれがどのように役立つかわかりません。


受け入れられた回答を使用した解決策:

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 '^[^/]*$'
4

1 に答える 1

2

「で始まる行間のgrepテキスト」の解決策を見つけることができませんでした。

の行を取得するには、次のように----言えます。

unrar v my_archive.rar | sed -n '/^----/,/^----/{/^----/!p}'
于 2013-09-17T12:18:11.580 に答える