巨大なタールボールからファイルを抽出しますが、2つのタイムスタンプの間でのみ生成されます。

巨大なタールボールからファイルを抽出しますが、2つのタイムスタンプの間でのみ生成されます。

2024-02-19 01:00:00と2024-02-19 02:00:00の間に巨大なtarballで生成されたファイルを解凍したいと思います。

tarではfindを実行できないので、tarとfindコマンドをどのように組み合わせるのかわかりません。

助けてくれてありがとう、アンドリュー

答え1

star実装tarヒリーツールシェルにあるものと同じ組み込みのものがあるか、findどちらもschilytoolsにありますが、schilytoolsでは、プルモードで使用すると、述部がアーカイブメンバーの属性に適用される可能性があります。ファイルシステムのファイルよりsfindfindboshstarx

これはBSD述語もfindサポートします-newerXY

だから:

star xf file.tar -find -newermt 2024-02-19T00:59:59 ! -newermt 2024-02-19T02:00:00

この範囲内で、履歴変更時間を持つアーカイブメンバーが抽出されます。

GNUツール(tar時々呼び出されますが、gtar通常tarGNUシステムではGNUを含む)の場合、1つのアプローチはそれを使用して--to-commandアーカイブメンバーをいくつかのコマンドにパイプすることです。ここで、メンバーの変更時間は環境変数で使用できますTAR_MTIME

START=$(date -d 2024-02-19T01:00:00 +%s) \
  END=$(date -d 2024-02-19T02:00:00 +%s) \
  tar -xf file.tar --to-command='
    if
      [ "$TAR_MTIME" -ge "$START" ] &&
        [ "$TAR_MTIME" -le "$END" ]
    then
      mkdir -p -- "$(dirname -- "$TAR_FILENAME")" &&
        cat > "$TAR_FILENAME" &&
        touch -d "@$TAR_MTIME" -- "$TAR_FILENAME"
    fi'

通常のファイルのみを抽出し(アーカイブに同じファイルへの複数のハードリンクがある場合は最初に発生します)、mtime以外のメタデータは保存しませんtouch

答え2

これは、わずかな調整でほとんどのUnixサーバーで動作できる一時スクリプトです。ファイル名の改行やユーザー名やグループ名のスペースなど、いくつかの珍しい名前はサポートされていません。データを確認してください。出力をフィルタリングして機能しますtar -tv

tar -tvf a.tar | perl -l -ne 's/-([^ ]* +){3}(2024-02-19 01:[0-9][0-9])(:[0-9][0-9])? // or next; s/[\t \x22\x27\\]/\\$&/g; print' >file-list.txt
<file-list.txt xargs tar -xvf a.tar

希望の時間間隔に一致する部分はです2024-02-19 01:[0-9][0-9]。 Perlがない場合は、sedまたはawkを使用できます。tar気に入らない場合は、試してみるか、tar -tvf FILENAME必要tar tvf FILENAMEなバリエーションを試してくださいtar

tar出力形式が異なる場合は、フィルタを調整する必要があります。上記のフィルタは GNU tar と BusyBox に適用されます。 BSD tar を使用すると、ユーザー名とグループ名がスペースで区切られ、最近数か月間異なる表示が行われるため、いくつかの調整が必要です。

tar -tvf a.tar | perl -l -ne 's/-([^ ]* +){5}(Feb 19 01:[0-9][0-9])(:[0-9][0-9])? // or next; s/[\t \x22\x27\\]/\\$&/g; print' >file-list.txt

関連情報