我刚刚收到了一堆LTO-5和一个磁带库,以及提取文件子集这一艰巨的任务。
数量级是从上述堆中取出60盘磁带,我需要拉出大约10,000个文件,每盘磁带70,000个(可能在六个或十二个asdd目录中)。磁带库正在运行tar 1.23
我确实已经按照每个磁带的内容预先存在转储,tar --list
所以我很乐意将其与我需要拉出的文件列表进行协调,以便可以提供适当的记录流以进行抓取,但是
tar -xvf /dev/nst0 -b $file_to_pull
直到我走到磁带的尽头,才停下来。这是有道理的-tar可能会被提供一个通配符模式,因此它只会在归档末尾出现。
我想我可以通过只输入目录glob并在不使用磁带的情况下清除不需要的文件来解决此问题,但是我不禁要想,有一种方法可以在EOF边界处停止tar并跳过清除步骤。正确的?但是,在我所有的狩猎活动中,我还没有发现任何类似的东西。
因此,问题:
是否有办法使tar(或heck,其他任何东西)从磁带头所在的位置仅拉出一个文件,然后停止?还是在焦油到达EOF并停止信号时发出信号?
或者,我在精神上以这种奇怪的方式进行攻击吗?如果有人得到,很高兴接受替代建议。
当然,请注意,这不是一个现在无法解决的问题,只是我当前的选择似乎非常尴尬-这是我第一次真正要处理这种规模的磁带(而我们的其他磁带都是LTFS) )
您可以要求tar每隔几个街区在它们称为检查点的位置执行一个操作。此操作可以测试是否已提取了所需文件,并杀死了tar。我使用tar文件尝试了它,看来效果还不错。
这是我进行测试的示例脚本,将/ 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句