我只想解压在 2024-02-19 01:00:00 和 2024-02-19 02:00:00 之间从一个巨大的 tarball 创建的文件。
我不知道应该如何组合 tar 和 find 命令,因为我无法在 tar 中运行 find。
谢谢你的帮助,安德鲁
答案1
实施star
从tar
希利工具有一个嵌入的,与 shell 中的或内置find
的相同,两者也在 schilytools 中,尽管在 中,当在 e 牵引模式下使用时,谓词可以应用于存档成员的属性而不是文件系统上的文件。sfind
find
bosh
star
x
这find
也支持-newerXY
BSD 的谓词。
所以:
star xf file.tar -find -newermt 2024-02-19T00:59:59 ! -newermt 2024-02-19T02:00:00
将提取记录的修改时间在该范围内的存档成员。
对于 GNU 工具(包括 GNU tar
,有时称为gtar
,但通常tar
在 GNU 系统上),一种方法可能是使用其--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