私は同様の投稿から取得し、次のスニペットを使用しています。https://unix.stackexchange.com/a/101273/212793- ファイルからファイル名を取得するtar.gz
:
tar tzf "archive.tar.gz" | awk -F/ '{ if($NF != "") print $NF }'
私の場合は、特定のファイルが1つだけ必要なので、次のようなものを使用します。
tar tzf "archive.tar.gz" | awk -F/ '{ if($NF != "") print $NF }' | grep -e "^..*my-file-name\\.ext$"
問題は、私.tar.gz
が大きく、ファイルがたくさん含まれていることです。しかし、それぞれは始めに同様の「ハッシュ」が追加されています(したがって^..*
私のgrep'd正規表現の一部です)。
したがって、これらのファイルは次のようになります。
- 4b77e4e1_file-a.ext
- 4b77e4e1_file-b.ext
- 4b77e4e1_file-c.ext
# ect.
tar tzf "archive.tar.gz" | awk -F/ '{ if($NF != "") print $NF }'
すべてのファイル()ストリーム出力を取得するコマンドを確認しました。
アイデアは、ストリームを「中断」してから最初のハッシュ部分を抽出できる場合は、ファイルの内容全体を繰り返すことなく、最終的に必要なファイル名を作成できることです.tar.gz
。
だから私の質問は、コマンド全体が完了するのを待たずに(数分かかります)、最初の出力で「中断」し、結果を把握して最終的に必要なファイル名を取得できるかどうかです。awk
編集する:最初の結果以降、単にingを実行しても実行時間が変わらないtar
ので、実際に中断したいようです。exit
答え1
次のことを試してください
tar tzf "archive.tar.gz" | awk -F/ '$NF ~ /my-filename$/ {print $NF ; exit }'
または
tar tzf "archive.tar.gz" | awk -F/ 'substr($NF,4,11) == "my-filename" {print $NF ; exit }'
(ここで4と11は実際のファイル名と一致します)。
答え2
パイプラインのプログラムの1つが終了すると、左側のプログラムも終了します。仕組みは次のとおりです。
- で終了し
foo | bar
ますbar
。 - プロセスを終了すると、パイプの読み取り端が閉じます。
foo
パイプに書き込もうとすると、SIGPIPE信号を受け取ります。foo
死んだ。
これはfoo
、SIGPIPEに対する保護がないと仮定します。プログラムはこれを実行できますが、一般的なコマンドラインプログラムはこれを実行できません。
1つの一致のみが必要なので、awkは興味のある行を探すとすぐに終了します。
tar tzf "archive.tar.gz" | awk -F/ '$NF ~ /.my-file-name\.ext$/ {print $NF; exit}'
または(ここではあまり有利ではありません)
tar tzf "archive.tar.gz" | sed -n '/[^/]my-file-name\.ext$/ {s!.*/!!; q}'
あるいは、awkとは別にgrepのより洗練されたアプローチに固執してください。
tar tzf "archive.tar.gz" | awk -F/ '{ if($NF != "") print $NF }' | grep -e "^..*my-file-name\\.ext$" | head -n 1
リーダーで終了すると、tar
次にパイプに書き込むと終了するため、時間がかかることがあります。出力バッファ。 (パイプに複数のプロセスがある場合は、各プロセスがSIGPIPEを受信するのに多少の遅延があるため、特に長い時間がかかりますawk
)find
。 buffer with filename は最後にバッファに書き込もうとし、SIGPIPEによって終了します。このアプリケーションでは、出力のためにtarをラインバッファリングに切り替える方が速いかもしれません。stdbuf
:
stdbuf -oL tar tzf "archive.tar.gz" | awk -F/ '$NF ~ /.my-file-name\.ext$/ {print $NF; exit}'
あるいは、awkが終了したときにtarプログラムを終了するように設定できますが、これはより複雑です。
sh -m 'tar tzf "archive.tar.gz" | {
awk -F/ "$0";
kill -TERM -$$;
}' '$NF ~ /.my-file-name\.ext$/ {print $NF; exit}'
[ $? -eq 143 ]
答え3
何かを印刷したら、AWKに終了するように指示できます。
awk -F/ '$NF != "" { print $NF; exit }'
特定のファイル名を探しているので:
awk -F/ '/my-file-name\.ext$/ && $NF != "" { print $NF; exit }'
これによりテスト$NF
が重複します。
awk -F/ '/my-file-name\.ext$/ { print $NF; exit }'