![在实际磁带档案中找到条目或 EOF 后停止 tar](https://linux22.com/image/1454546/%E5%9C%A8%E5%AE%9E%E9%99%85%E7%A3%81%E5%B8%A6%E6%A1%A3%E6%A1%88%E4%B8%AD%E6%89%BE%E5%88%B0%E6%9D%A1%E7%9B%AE%E6%88%96%20EOF%20%E5%90%8E%E5%81%9C%E6%AD%A2%20tar.png)
我刚刚接到一堆 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