tarファイルを抽出せずにtarファイル内のディレクトリ数を決定します。

tarファイルを抽出せずにtarファイル内のディレクトリ数を決定します。

アーカイブを抽出せずに、アーカイブファイル(tar.bzなど)内のディレクトリ数を計算する必要があります。アーカイブが大きすぎるため、コンピューティングディレクトリを抽出して使用するのは困難ですls | wc -l

答え1

その後、アーカイブ内のすべてのファイルがリストされ/(folders)で終わる行を見つけて、行数を数える必要があります。

tar -tvf file.tar | grep -c '/$'

編集:最上位ディレクトリのみを計算するには、次の手順を実行します。

tar --exclude='./*/*' -tvf file.tar | grep -c '/$'

再帰的にさらに一歩深くしたい場合:

tar --exclude='./*/*/*' -tvf file.tar | grep -c '/$'

など...

答え2

すべての場合に正しく機能する唯一の方法は、次のものを使用することですstar -find

star -t -v -f file.tar -find -type d | wc -l

ディレクトリ名がスラッシュで終わらない場合でも、すべての場合に機能します。ディレクトリ名にスラッシュを追加する汚れた方法は、1980年頃にファイルタイプ "directory"がtar形式で知られていないように導入されました。 POSIXはこれを必要とせず、一部のtar実装はディレクトリ名にスラッシュを追加しません。

'^ 0 d'パス名に改行文字が含まれている場合は、実際のリスト行の先頭のみを計算するようにgrep forを実行するか、以下を使用する必要があります。

star -t -f file.tar -find -type d -print0 -false

次に、出力を次のようにパイプして、出力内のnul文字数を計算します。

LC_ALL=C tr -cd '\0' | wc -c

答え3

GNUtarまたはを使用すると、bsdtar次のものを使用できます。

tar tvf file.tar | grep -c '^d'

tarGNUとGNUは両方とも、filenamesで改行文字をレンダリングするのと同じ方法でbsdtar長いリスト()の行の最初の文字としてファイルタイプを出力するため、アーカイブメンバー名に改行文字が含まれていても機能します。tvls -l\n

これは/末尾の文字を見つけるよりも安定しています。@schilyが言ったように、それがそこにあるという保証はありません。

POSIXlyでは、次のものを使用できます。

pax -o listopt=%.1M < file.tar | grep -cx d

-o listoptすべての実装がこれをサポートするわけではありませんがpax、特にhttp://www.mirbsd.org/pax.htmUbuntuでpaxを見つけました。

pax -v < file.tar | grep -c '^d'

移植性は高いですが、改行を含むファイル名が原因で失敗する可能性があります。

関連情報