я вечерком отпишусь.
Вечерком закончился трафик, были пиво и разговоры в реале
Но я продолжал обдумывать скрипт. Сегодня примерно за 3 часа, 2 кружки кофе и несколько сигарет родился скрипт:
#!/bin/sh
PACK_PATH=/root/packs
NAME=`basename $1 .pet`
mkdir -p $PACK_PATH
# выходные файлы
OUT_FILES=$PACK_PATH/$NAME.files
OUT_LDD=$PACK_PATH/$NAME.ldd
# выводим список файлов в пакете
tar -tvf $1 > $OUT_FILES
# распаковываем пакет в /tmp
tar -x -C /tmp -f $1
# список файлов
FILELIST=`find /tmp/$NAME -type f`
# "грязный" список зависимых библиотек
for FILENAME in $FILELIST
do
if file $FILENAME | grep -q ELF # Внимание: исправил
then
echo "`ldd $FILENAME`" >> $OUT_LDD
fi
done
# удаление распакованного пакета из /tmp
rm -r /tmp/$NAME
# удаление мусора, сортировка и удаление дубликатов
sed -i 's/\t//g' $OUT_LDD
sed -i 's/ (0x........)//g' $OUT_LDD
sed -i 's/not a dynamic executable//g' $OUT_LDD
cat $OUT_LDD | sort | uniq > $OUT_LDD
Его нужно положить туда, где его найдет система (не забыв и про флажок исполнимости). У меня этот скрипт —
/usr/bin/filesСкрипт принимает один параметр —
полное имя pet-пакета. Мои примеры:
files /mnt/home/data/soft/games/frozen-bubble-2.2.0-i686-1as.pet
files /mnt/home/data/soft/games/pingus-0.6.0.pet
А так хотелось бы из текущей папки дать просто команду:
files ./frozen-bubble-2.2.0-i686-1as.pet
Но я «ниасилил»
Зато, клавиша Tab помогает как и прежде.
В результате работы скрипта в папке ~/packs появляются два файла, например:
pingus-0.6.0.files
pingus-0.6.0.ldd
В первом файле — список всех файлов в пакете, во втором —
список файлов библиотек, от которых зависит этот пакет.
Для чего нужен второй файл? В дальнейшем хочется, с помощью сообщества создать базу данных библиотек по каждому из дистрибутивов PuppyRus. Написать скрипт, который будет говорить, подходит ли данный пакет для конкретного дистрибутива, или нужно доустановить конкретные библиотеки (которые находятся в таких-то пакетах).
UPD: Я поторопился со следующим кодом, в результате то, что он выдавал невозможно было использовать как базу данных. Теперь я это исправил (sorry, f329):Если кто-то готов сделать сейчас список файлов своего дистрибутива, то вот вам скрипт
so-list:
#!/bin/sh
DIRS="/bin /etc /lib /opt /sbin /usr /var"
for DIR in $DIRS
do
find $DIR -xtype f -name "*.so*" >> so2.txt
done
for LINE in `cat so2.txt`
do
echo "`ls -l $LINE`" >> so.txt
done
rm so2.txt
После этого прикрепите файл so.txt к сообщению в форуме, указав название дистрибутива.
Обращаю ваше внимание на то, что запускать этот скрипт нужно на «голой» системе, как она идет «из коробки», до установки разного постороннего софта.