アーカイブを抽出せずに、アーカイブファイル(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'
tar
GNUとGNUは両方とも、filenamesで改行文字をレンダリングするのと同じ方法でbsdtar
長いリスト()の行の最初の文字としてファイルタイプを出力するため、アーカイブメンバー名に改行文字が含まれていても機能します。tv
ls -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'
移植性は高いですが、改行を含むファイル名が原因で失敗する可能性があります。