Сценарии многотомного (GNU) 'tar' с предопределенным количеством объемов

Следующая ссылка решила для меня эту проблему. Как вы можете ссылаться на конкретную версию разделяемой библиотеки в GCC

Выдержка из ссылки, которая помогла мне-

Вместо того, чтобы использовать "-lcurl", используйте "-l:libcurl.so.3". " И конечно же используйте "-L _installed_path_"

Моя ошибка была обратной - "Неправильная версия библиотеки JPEG: библиотека 80, вызывающий абонент ожидает 62"

Чтобы узнать с какой jpeg библиотекой был скомпонован мой бинарник, я сделал-

ldd my_binary | grep jpeg

вывод был-

libjpeg.so.8 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so.8

Очевидно, что бинарник зависел от libjpeg8 (библиотека 80), поэтому я и получил ошибку.

Чтобы узнать, действительно ли у меня в системе есть libjpeg62, я сделал

ldconfig -p | grep jpeg

вывод был-

libplayerjpeg.so.3.0 (libc6,x86-64) => /usr/lib/libplayerjpeg.so.3.0
libopenjpeg.so.2 (libc6,x86-64) => /usr/lib/libopenjpeg.so.2
libjpeg.so.62 (libc6,x86-64) => /usr/local/lib/libjpeg.so.62
libjpeg.so.62 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so.62
libjpeg.so.8 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so.8
libjpeg.so.8 (libc6) => /usr/lib/i386-linux-gnu/libjpeg.so.8
libjpeg.so (libc6,x86-64) => /usr/local/lib/libjpeg.so
libjpeg.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so

Так что в моем случае, вместо того, чтобы просто использовать -ljpeg, я использовал это (в файле make)-

-L/usr/lib/x86_64-linux-gnu/ -l:libjpeg.so.62

Не забудьте заменить #include (jpeglib.h> в вашем cpp-файле на

extern "C" {
#include "jpeglib.h" }

0
29.11.2014, 11:15
1 ответ
$ eval echo -e "n\ $d/$prf.00{2..$last}.tar\\\n"
n someprefix.002.tar
 n someprefix.003.tar
 n someprefix.004.tar

Как этот пробел попал внутрь?

Ответ в двух словах: это аналогично выводу, который вы получите, если повторите строку с расширением имени файла на кучке файлов, имена которых заканчиваются на новую строку.

Как описано в Brace expansion:

Шаблоны, которые должны быть развернуты с помощью скобок, принимают форму необязательной преамбулы, за которой следует либо серия строк, разделенных запятыми, либо выражение последовательности между парой скобок, за которым следует необязательный постскриптум.

Итак, оболочка вычисляет

echo -e n\ dir/prefix00{2..4}.tar\\n
        ^preamble^^^^^^      ^postscript

И, как и в случае с расширением имени файла, она вставляет пробел между каждым развернутым элементом, так что вы получаете (для ясности я сохраняю здесь экранирующую последовательность \n):

n dir/prefix002.tar\n n dir/prefix003.tar\n n dir/prefix004.tar\n\n

QED.

Что касается вашего основного вопроса о том, как в скрипте подавать tar информацию для прохождения через несколько томов, вот два способа:

  • Используйте seq для генерации команд n:
    seq -f "n $d/$prf.%03g.tar" 2 $last | tar -Mtvf $d/$prf.001.tar
  • Напишите короткий скрипт для генерации каждого нового имени тома и передайте его в опцию tar --new-volume-script:
    echo '#!/bin/sh' > ./newvol
    echo "printf $d/$prf.%03d.tar \$TAR_VOLUME >&\$TAR_FD" >> ./newvol
    chmod +x ./newvol
    tar -Mtvf $d/$prf.001.tar --new-volume-script=./newvol
2
28.01.2020, 02:36

Теги

Похожие вопросы