在实际磁带档案中找到条目或 EOF 后停止 tar

在实际磁带档案中找到条目或 EOF 后停止 tar

我刚刚接到一堆 LTO-5 和一个磁带库,以及提取部分文件这项令人兴奋的任务。

数量级是60盘磁带从那堆东西中,每盘磁带约有 10,000 个文件,每个文件 70,000 个(可能在六个或十几个 asstd 目录中)我需要提取。磁带库正在运行焦油 1.23

我确实有预先存在的每盘磁带内容的转储,因此tar --list我很乐意将其与我需要提取的文件列表进行协调,以便我可以输入适当的记录流来抓取,但是

tar -xvf /dev/nst0 -b $file_to_pull

直到到达磁带末尾才会停止。这很合理 - tar 可能被输入了通配符模式,因此它只会到达存档末尾。

我想,我可以通过输入目录 glob 并在不需要的文件离开磁带后清除它们来解决这个问题,但我不禁想到一定有一种方法可以在 EOF 边界处停止 tar 并跳过清除步骤。对吗?然而,在我所有的搜寻中,我还没有发现任何这种性质的东西。

因此,问题是:

  • 有没有办法让 tar (或其他任何东西) 从磁带头所在的位置拉出一个文件,然后停止? 或者一旦收到 EOF 就向 tar 发出信号并停止?

  • 另外,我是不是在用一种奇怪的方式进行心理攻击?如果有人有其他建议,我很乐意接受。

当然,这并不是现在无法解决的问题,只是我目前的选择似乎真的很尴尬——这是我第一次真正处理如此大规模的磁带(我们的其他磁带都是 LTFS)

答案1

你可以要求 tar 每隔几个块运行一次操作,他们称之为检查站。此操作可以测试所需文件是否已提取,如果已提取,则终止 tar。我尝试使用 tar 文件,似乎运行正常。

这是我进行测试的示例脚本,tarring /usr/bin 并将 usr/bin/bash 提取到 /tmp/usr/bin/bash。默认的 --checkpoint 是 10 个块。

#!/bin/bash

cat <<\! >/tmp/checkdone
#!/bin/bash
# env has TAR_CHECKPOINT TAR_ARCHIVE TAR_VERSION TAR_BLOCKING_FACTOR
# tar -C directory is NOT used for checkpoint action!
want=$1

if size=$(stat --printf='%s\n' "$want" 2>&1)
then if [ "$(</tmp/lastsize)" = "$size" -a -s /tmp/pid ]
    then  echo "same size $size. time to stop"
          ls -l "$want"
          >/tmp/lastsize
          kill -1 $(</tmp/pid)
    else  echo "partial size $size"
          echo "$size" >/tmp/lastsize
    fi
else echo -n "."
fi
!
chmod +x /tmp/checkdone
>/tmp/lastsize
>/tmp/pid

tar -cf /tmp/tar /usr/bin/ # create example tar file
# wanted file. must be in current dir
want=usr/bin/bash
cd /tmp || exit # dont use tar -C dir

tar -xvf /tmp/tar "$want" --checkpoint=10 --checkpoint-action=exec="/tmp/checkdone $want" &
echo $! >/tmp/pid
wait

rm /tmp/tar /tmp/pid /tmp/lastsize /tmp/checkdone
rm -fr /tmp/usr

相关内容