2024-02-19 01:00:00と2024-02-19 02:00:00の間に巨大なtarballで生成されたファイルを解凍したいと思います。
tarではfindを実行できないので、tarとfindコマンドをどのように組み合わせるのかわかりません。
助けてくれてありがとう、アンドリュー
答え1
でstar
実装tar
ヒリーツールシェルにあるものと同じ組み込みのものがあるか、find
どちらもschilytoolsにありますが、schilytoolsでは、プルモードで使用すると、述部がアーカイブメンバーの属性に適用される可能性があります。ファイルシステムのファイルよりsfind
find
bosh
star
x
これはBSD述語もfind
サポートします-newerXY
。
だから:
star xf file.tar -find -newermt 2024-02-19T00:59:59 ! -newermt 2024-02-19T02:00:00
この範囲内で、履歴変更時間を持つアーカイブメンバーが抽出されます。
GNUツール(tar
時々呼び出されますが、gtar
通常tar
GNUシステムでは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