Копирование файлов на основе частичных имен в файле

Как было сказано в комментариях, единственный надежный способ создать единый двоичный файл, который будет работать в разных выпусках Debian (или любом дистрибутиве Linux), - это построить его статически. Это хорошо поддерживается в Debian и других местах, в том числе с помощью pkg-config и т. Д. Статические двоичные файлы могут работать десятилетиями; интерфейс пользовательского пространства ядра поддерживается обратно совместимым образом (иногда он ломается, но это считается ошибкой и обычно исправляется быстро). Вы найдете случаи, когда статические двоичные файлы перестают работать, но это обычно связано либо с обработкой libnss (это динамично даже в статических двоичных файлах), либо с изменениями в ожиданиях X-сервера (это происходит с старым Linux games ), или ядра дистрибутивов, отказывающиеся от поддержки функций, которые считаются устаревшими ( например, звуковой интерфейс OSS в ядрах Ubuntu).

(Другой подход - отправить все ваши зависимые библиотеки и использовать rpath или сценарий оболочки для правильной настройки; это то, что делает Steam, и многие игры для Linux, не относящиеся к Steam, тоже делают это, но это менее надежно, чем статическое связывание, и его труднее исправить, когда что-то пойдет не так.)

Ваш динамический двоичный файл, созданный на Debian 6, работает на Debian 8, потому что прямые зависимости двоичного файла все еще доступны в вашей установке Debian 8; это чистая удача, и на нее нельзя положиться. Например, ваш двоичный файл связан с libssl.so.0.9.8 ; это все еще работает для вас в Debian 8, потому что у вас все еще есть старая libssl0.9.8 (обратите внимание, что ссылка удовлетворяет /usr/lib/i686/cmov/libssl.so.0.9.8 , который не использует многоархивный путь и предположительно исходит из старый пакет). Создавая Debian 8 без старых пакетов, вместо этого вы получите ссылку на libssl.so.1.0.0 , а она недоступна в Debian 6. (Это та ситуация, в которой вы бы хотели в итоге вы получите только что установленную систему Debian 8.)

Ваш двоичный файл, созданный для Debian 8, не работает в Debian 6, и это совершенно нормально: двоичная совместимость только по возрастанию, а не по убыванию. Это означает, что если вы создаете двоичный файл в Debian 6, а он по-прежнему находит свои библиотеки в Debian 8, он должен работать нормально; но бинарный файл, связанный с Debian 8, может ожидать символов в библиотеках, которые недоступны в Debian 6, без изменения названий библиотек. Ошибка, связанная с g_thread_create , возникает из-за того, что вы построили Debian 8, где libglib-2.0.so.0 имеет этот символ, но Debian 6 libglib-2.0.so. 0 нет. Если вы создали пакет, содержащий ваш двоичный файл, зависимости пакета будут правильно определять это (вы получите зависимость как минимум от libglib2.0-0 (> = 2.31.8) ; Debian 6 имеет только версию 2.24.2).

Лучший способ защитить вашу установку в будущем - это создать пакет с исходным кодом с зависимостями, которые могут быть удовлетворены в Debian 6 и 8; тогда вы можете легко собрать правильные двоичные пакеты для Debian 6, 7, 8, 9 ...Это несколько сложнее, чем создание статического двоичного файла, по крайней мере, в первые несколько раз, когда вы это делаете, но я думаю, что в долгосрочной перспективе это того стоит, если вы планируете выполнять такие типы обновлений в будущем. Обычно для этого используется pbuilder , он поддерживает сборку для различных дистрибутивов ( sbuild также может это делать). Расширение приведенных мной инструкций для Debian 6 должно быть относительно простым (продублируйте обработку STABLE_CODENAME для OLDOLDSTABLE_CODENAME и используйте архивные репозитории ).

0
30.04.2019, 07:56
2 ответа

Что-то вроде этого поможет?

pushd /home/iris/filesToExtract
for i in $(</home/iris/hdpvr.txt); do find. -mindepth 1 -maxdepth 1 -type f -name "*_$i.xml" -print0 | xargs -r -0 -i mv "{}" /home/iris/xmlfiles; done
find. -mindepth 1 -maxdepth 1 -type f -name "*.xml" -delete  
popd
  • pushd переместит вас в указанный каталог
  • Строка for+find получит идентификатор из вашего текстового файла, найдет файлы, заканчивающиеся на _ID.xml, и переместит их в папку /home/iris/xmlfiles
  • последний лайк удалит неперемещенные файлы, но только в этой папке, а не в подпапках
  • popd вернет вас в исходный каталог

Вы также можете сделать это жестоким способом с mv, но он выдаст ошибки, если файл не будет найден

pushd /home/iris/filesToExtract
for i in $(</home/iris/hdpvr.txt); do mv "*_$i.xml" /home/iris/xmlfiles; done
find. -mindepth 1 -maxdepth 1 -type f -name "*.xml" -delete  
popd
1
28.01.2020, 02:22

Еще одно решение, спасибо glenn jackmann !

#!/bin/bash

# folder where the xml files are stored
xmldir=/home/iris/filesToExtract

# xml backup folder
backupdir=/home/iris/xmlfiles

while read -r line; do
    mv -t "$backupdir" *_*_${line}.xml 2>/dev/null
done <"$xmldir/hdpvr.txt"
rm -i *.xml

Шаблон *_*_${line}.xmlиспользуется для поиска файлов в каталоге.

Замените rm -i *.xmlна rm *.xml, если вы хотите немедленно удалить оставшиеся XML-файлы.

2
28.01.2020, 02:22

Теги

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