tarとtreeコマンドのためのパイプ?

tarとtreeコマンドのためのパイプ?

大容量圧縮ファイル(特に2番目のレベルディレクトリ)のツリーを表示したいので、次のコマンドを使用しました。 tar -tf tarfile | tree -L 2

しかし、圧縮ファイルのツリーではなく、私がいるディレクトリのツリーが出力されます。他のコマンドはうまく動作します。たとえば、これにより tar -tf tarfile | less tarファイルを正しく参照できます。

tree私が何か間違っているのでしょうか?それとも、他のコマンドのようにパイピングを通じて使用できないのでしょうか?そうでない場合は、圧縮ファイルの2次ディレクトリにあるファイルのみを表示する別の方法がありますか?

答え1

tree標準入力のファイルリストを引数として受け入れることができます--fromfile

ファイルシステムではなく、ファイルからディレクトリのリストを読みます。コマンドラインで指定されたパスは、検索するディレクトリではなく読み取るファイルです。ドット(.)ディレクトリは、ツリーが標準入力からパスを読み取る必要があることを示します。

したがって、次のことを試すことができます。

tar -tf tarfile | tree --fromfile .

しかし、残念ながら、-Lこの主張は、少なくとも私のコンピュータで標準入力を読むときには機能しません。

答え2

stdinを読み取らずに実際のディレクトリ構造(現在のディレクトリまたは指定されたディレクトリ)を参照するので、treetarファイルのディレクトリを後処理する必要があります。 tarファイルがフル/絶対パス名で作成されている場合は、目的のディレクトリの深さを見つけるために範囲を調整する必要があります。

1つのオプションは次のとおりですawk

tar -tf tarfile | awk -F/ 'NF == 3'

もう1つの方法は次のとおりですcut(レベル2以上のサブディレクトリが原因で親ディレクトリが再報告されないように一意に並べ替えられます)。

tar -tf tarfile | cut -d/ -f1-3 | sort -u

関連情報