tarリストファイルのみ


16

おもしろい事実:アーカイブマネージャーを使用して.tar.gzを抽出し、「ディレクトリ構造を保持する」のチェックを外すと、tarbombが取得されます。

tar -ztftarファイル内のすべてのファイルとディレクトリをリストします。ディレクトリ構造なしで、tarファイル内のすべてのファイルをリストする方法はありますか?


で 'tarbomb'効果を得ることができますtar xvzf my_tar.tar.gz --transform 's/.*\///'。しかし残念ながら、それはそれはでリストに表示される方法を変更しないtのではなくx
ire_and_curses

4
気になるのは、適切に構成されたアーカイブでさえ、大量抽出の武器を作成するのに非常に簡単に使用できることです。
エーロアールトネン

回答:


17

マニュアルページからそれを行う方法はわかりませんが、結果をいつでもフィルタリングできます。以下は、ファイル名に改行がないことを前提としています。

tar tzf your_archive | awk -F/ '{ if($NF != "") print $NF }'

使い方

フィールド区切り文字をに設定する/と、最後のフィールドはawk$NF)がファイル名を処理している場合はファイル名、ディレクトリ名を処理している場合は空です(ディレクトリ名にtar末尾のスラッシュが追加されます)。したがって、基本的にawkは、最後のフィールドが空でない場合は印刷するように指示しています。


awkを使用した非常に良い作業:)
Eero Aaltonen

5

Joseph R.の提案を利用して、末尾がでない行を探すことでファイルに正規表現[^/]$を使用できます。grep/

tar tzf archive.tar.gz | grep -e "[^/]$"


これfoo/barは、単にに対してではなく、まだ出力されbarます。必要なgrep -Eo '[^/]+$'(GNU grepを使用)。
ステファンシャゼル

4

ファイル名に改行が含まれていないと仮定します。

tar -tf foo.tar | sed -e 's#.*/##' -e '\#.#!d'

最初のsedコマンドは/、行の最後の前のすべてを削除するため、ファイル名の部分のみが出力されます。2番目のコマンドは、現在空になっている行、つまりa /で終わる行(ディレクトリ)を削除します。


sed:-e expression#2、char 2:不明なコマンド: `/ 'およびsed構文はあまり感じられません。.直感的
Eero Aaltonen

@EeroAaltonen sedコマンドを修正しました。実際、構文はやや不可解です(答えに説明を含めます)。
ジル「SO-悪であるのをやめる」

2

pax(読み取りにPOSIXコマンドtarファイル):

pax -'s@.*/@@' < file.tar

(ディレクトリを含む、タイプに関係なくすべてのファイルをリストします)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.