tarリストファイル、最初のファイルで中断

tarリストファイル、最初のファイルで中断

私は同様の投稿から取得し、次のスニペットを使用しています。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を受信するのに多少の遅延があるため、特に長い時間がかかりますawkfind。 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 }'

関連情報