从巨大的 tarball 中解压文件,但仅在两个时间戳之间创建

从巨大的 tarball 中解压文件,但仅在两个时间戳之间创建

我只想解压在 2024-02-19 01:00:00 和 2024-02-19 02:00:00 之间从一个巨大的 tarball 创建的文件。

我不知道应该如何组合 tar 和 find 命令,因为我无法在 tar 中运行 find。

谢谢你的帮助,安德鲁

答案1

实施startar希利工具有一个嵌入的,与 shell 中的或内置find的相同,两者也在 schilytools 中,尽管在 中,当在 e 牵引模式下使用时,谓词可以应用于存档成员的属性而不是文件系统上的文件。sfindfindboshstarx

find也支持-newerXYBSD 的谓词。

所以:

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

相关内容