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

taz*_*yok 4 linux tar find

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

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

谢谢你的帮助,安德鲁

Sté*_*las 7

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

这find也支持-newerXYBSD 的谓词。

所以:

star xf file.tar -find -newermt 2024-02-19T00:59:59 ! -newermt 2024-02-19T02:00:00
Run Code Online (Sandbox Code Playgroud)

将提取记录的修改时间在该范围内的存档成员。

对于 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'
Run Code Online (Sandbox Code Playgroud)

请注意,它仅提取常规文件(如果存档中存在多个指向同一文件的硬链接,则为第一次出现),不保留除 mtime 之外的任何元数据touch。

  • `tar` 不再是一个标准命令,几十年前它就从 X/Open 中删除了。 (2认同)