Battle Forum

Battle Forum (http://battlefox.rooty.ru/index.php)
-   Программная - Linux (http://battlefox.rooty.ru/forumdisplay.php?f=80)
-   -   Сила shell'ов (http://battlefox.rooty.ru/showthread.php?t=3519)

tmp0000 29.05.2007 01:06

Сила shell'ов
 
Вот написал скриптик:
Спойлер

#/bin/bash
# Script for cleaning old Debian packaged
# Author: Igor Pellinen (Russia) aka Igron aka tmp0000

# First, create file with Packages
dpkg-scanpackages . /dev/null > Packages 2>/dev/null

# Make temporary directory
mkdir temp_dir_with_new_packages

# Move actual files to temporary directory
for i in `awk '/^Filename:/ {print $2}' Packages`; do test -f $i && mv $i ./temp_dir_with_new_packages/; done

# Delete old Debian packages, they are in current directory
rm -f ./*.deb

# Now, after deleting old packages, we must back actual packages back to the current directory:
cd ./temp_dir_with_new_packages/
for i in *.deb; do mv $i ../; done
cd ../

# Remove temporary directory and packages files
rmdir temp_dir_with_new_packages
rm Packages

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

Как можно улучшить скорость работы скрипта?

Frosty 29.05.2007 14:59

Не прокатит такой вариант:в очищаемой папке создать файлик old-debs и при нахождении старого пакета записать в него remove /path/to/old/deb/ и интер :) и так по циклу, а потом просто запустить этот скрипт :) Или бред?

rmn 29.05.2007 16:46

Код:

#!/bin/bash

dpkg-scanpackages . /dev/null > Packages 2>/dev/null
ls -1 ./*.deb | sort > old.list
awk '/^Filename: / {print $2}' Packages | sort > new.list
diff {old,new}.list | grep '^< ' | sed 's/^< //' | xargs rm -f
rm -f {old,new}.list

так лучше ? :)

greiv 29.05.2007 17:36

Цитата:

Сообщение от tmp0000 (Сообщение 123807)
Вот написал скриптик:
Спойлер

#/bin/bash
# Script for cleaning old Debian packaged
# Author: Igor Pellinen (Russia) aka Igron aka tmp0000

# First, create file with Packages
dpkg-scanpackages . /dev/null > Packages 2>/dev/null

# Make temporary directory
mkdir temp_dir_with_new_packages

# Move actual files to temporary directory
for i in `awk '/^Filename:/ {print $2}' Packages`; do test -f $i && mv $i ./temp_dir_with_new_packages/; done

# Delete old Debian packages, they are in current directory
rm -f ./*.deb

# Now, after deleting old packages, we must back actual packages back to the current directory:
cd ./temp_dir_with_new_packages/
for i in *.deb; do mv $i ../; done
cd ../

# Remove temporary directory and packages files
rmdir temp_dir_with_new_packages
rm Packages

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

Как можно улучшить скорость работы скрипта?

Кхм... Если ты можешь отделить старые от актуальных, то чегобы их сразу не мочить, не создавая никаких дерикторий левых и не делая не нужных перемещений.

rmn 29.05.2007 17:41

greiv, если бы он мог это сделать, то не заморачивался бы с написанием скриптов. :) Вообще, чтобы "вкурить" что он хочет автоматизировать, надо примерно знать как устроены и создаются репозитории debian/ubuntu и как там нумеруются версии пакетов.

greiv 29.05.2007 18:34

rmn, а ты внимательно прочитай, что он в скобках написал - ...туда перемещаются нужные (актуальные) пакеты. Т.е. все же он их различает актуальные-то. Или он просто выразился не правильно.

rmn 29.05.2007 18:44

greiv, я внимательно читал, более того - этой фигней занимался уже.

Есть каталог, в него навалена куча deb-пакетов различных версий, например, foo 0.40, foo 0.41, foo 0.41 backported. Пакетов для простоты - 1000 штук по 3-4 версии каждого.
Из них в каталоге нужно оставить только "актуальные" пакеты (вроде foo 0.41).

dpkg-scanpackages, грубо говоря, выдаёт список "актуальных" пакетов. Задача сводится к тому, чтобы из начального списка вычленить неактуальные, используя шелл.

greiv 29.05.2007 20:04

rmn, ну цель-то понятна=), раз dpkg-scanpackages такой хороший, что выплевывает список "актуальных" пакетов, то зачем нужна свистопляска с отдельными директориями и перемещениями по тысячу раз... как будто неактуальные нельзя замочиь в том же каталоге

rmn 29.05.2007 21:13

greiv, мне не совсем понятно, что ты предлагаешь. Шелл-сценарий для решения задачи в студию. :)

tmp0000 29.05.2007 21:20

Цитата:

Код:

diff {old,new}.list | grep '^< ' | sed 's/^< //' | xargs rm -f
так лучше ?
Вроде да, я это пытался сделать, но как-то "ниасилил".. :(

Frosty 29.05.2007 21:31

Цитата:

Сообщение от rmn (Сообщение 123990)
Код:

dpkg-scanpackages . /dev/null > Packages 2>/dev/null
ls -1 *.deb | sort > old.list
awk '/^Filename: / {print $2}' Packages | sort > new.list
diff {old,new}.list | grep '^< ' | sed 's/^< //' | xargs rm -f
rm -f {old,new}.list

так лучше ? :)

Нипаешт :) закоим то создает новый Packzges.gz а пакетов старых не потирает :)

rmn 29.05.2007 21:34

Frosty, опять напилсо. попробуй его с утра запустить. :]

tmp0000 29.05.2007 21:34

Цитата:

Сообщение от rmn (Сообщение 124153)
Frosty, опять напилсо. попробуй его с утра запустить. :]

+1!!! :D :D :D

Frosty 29.05.2007 21:59

Цитата:

Сообщение от rmn (Сообщение 124153)
Frosty, опять напилсо. попробуй его с утра запустить. :]

Дануна, я закинул скриптв папку с архивами, запустил, он нахреначил мне новый Packages.gz, о чем и написал в консоли с подробным выводом списка пакетов, которые он включил, а файл gstreamer0.10-plugins-ugly_0.10.4-0ubuntu2_i386, лежащий рядом с gstreamer0.10-plugins-ugly_0.10.5-0ubuntu2_i386 не похерил...

rmn 30.05.2007 13:04

Frosty, дык .gz надо развернуть предварительно. Либо прямо в скрипте изменить строку так:
Код:

zcat Packages.gz | awk '/^Filename: / {print $2}' | sort > new.list


Добавлено через 14 часов 31 минуту
Frosty, все-таки решил проверить на себе код ;) чтобы 100% работало без собственноручных доводок, нужно подправить строку
Код:

ls -1 ./*.deb | sort > old.list

Frosty 30.05.2007 14:25

полностью от начала и до конца выложи скрипт, а то опять тренироваца не хочется :)

tmp0000 30.05.2007 15:55

Цитата:

полностью от начала и до конца выложи скрипт, а то опять тренироваца не хочется
Да, я тоже себе кое-что убил :(

rmn 30.05.2007 16:04

код
должно работать :) но проверять сейчас времени нет.

Frosty 30.05.2007 21:12

Цитата:

Сообщение от rmn (Сообщение 124456)
код
должно работать :) но проверять сейчас времени нет.

Опять мимо :)

Код:

frosty@frosty-desktop:~/Desktop/неозаглавленная папка$ sudo sh "/home/frosty/Desktop/неозаглавленная папка/clean"
diff: пропущен операнд после `{old,new}.list'
diff: Попробуйте `diff --help' для получения более подробного описания.

Но пакеты хотя бы разграничивает:
Цитата:

Сообщение от old.list
./gstreamer0.10-plugins-ugly_0.10.4-5_i386.deb
./gstreamer0.10-plugins-ugly_0.10.5-0ubuntu2_i386.

Цитата:

Сообщение от new.list
./gstreamer0.10-plugins-ugly_0.10.5-0ubuntu2_i386.


rmn 30.05.2007 21:33

Frosty, скрипт написан на bash, а ты его запускаешь через sh. RTFM :)


Текущее время: 13:27. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot