1

Мне только что передали кучу LTO-5 и ленточную библиотеку, а также захватывающую задачу по извлечению подмножества файлов.

Порядок величины составляет 60 лент из указанной стопки, около 10000 файлов по 70000 на кассету (в полдюжине или дюжине каталогов asstd), которые мне нужно вытащить. Библиотека магнитных лент работает под управлением tar 1.23

У меня есть уже существующие дампы содержимого каждой ленты в соответствии с tar --list поэтому я рад согласовать это с моим списком файлов, которые мне нужно вытащить, чтобы я мог подать в нужном потоке записей для захвата, но

tar -xvf /dev/nst0 -b $file_to_pull

не останавливается, пока я не доберусь до конца ленты. Что имеет смысл - tar может быть заполнен шаблоном подстановки, поэтому он просто идет в конец архива.

Я думаю, что я мог бы решить эту проблему, просто введя глобус каталога и очистив ненужные файлы, как только они были записаны, но я не могу не думать, что должен быть способ остановить tar на границе EOF и пропустить шаг очистки , Правильно? Однако во всей моей охоте я не нашел ничего подобного ..

Итак, вопросы:

  • Есть ли способ заставить tar (или, черт возьми, что-нибудь еще) извлечь только один файл, где бы ни находилась головка ленты, и затем остановить? Или подать сигнал tar, как только он получит EOF и остановится?

  • С другой стороны, я мысленно атакую это странным образом? Рад принять альтернативные предложения, если кто-нибудь их получил.

Отмечая, конечно, это не проблема, которая сейчас неразрешима, просто мои текущие параметры кажутся действительно неуклюжими - это первый раз, когда мне действительно приходилось иметь дело с лентой такого масштаба (а все остальные наши ленты - LTFS)

1 ответ1

2

Вы можете попросить 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .