Чистка старых версий портежей
Гость 15 марта, 2005 - 06:07
Подскажите существует ли скриптик который правильно удалял бы старые версии сурсов. Т.е. допустим оставил бы эксперементальные и последние стабильные. "emerge -P" вроде похоже. Подскажите плиз, новичку, а то 35 Гб дистфайлов меня пугают ;)
»
- Для комментирования войдите или зарегистрируйтесь

сам emerge sync удаля
сам emerge sync удаляет из портажа старые ссылки! (если я не ошибаюсь)
Но distfiles не трог
Но distfiles не трогает
Удаление ненужных distfiles
http://linuxshop.ru/forum/viewtopic.php?t=11114
Чтото на сайт автора зайти не получилось, но скрипты у меня его лежат... могу выслать... Хотя я гдето похожий скрипт от другогго человека видел
ИМХО
Вообще, ИМХО, такой скрипт написать не очень сложно.... будет время, попробую написать на BASH'е ;-)
Вышлите плиз. Ме
Вышлите плиз. Меня интересует именно удаление старых дистфайлов, но только так чтобы он просматривал все мои дистфайлы т.к. у меня не все дистфайлы одинаково синхронихизированы с портежами. Надеюсь понятно выразился. А вообще конечно большое спасибо.
"Чтобы попасть в Рай нужно переплыть Лету"
Станислав Ежи Лец
выслать не могу
выслать не могу всвязи с незнанием твоего Email...
Вот clean.pl
#!/usr/bin/perl # Вывод или удаление ненужных distfiles'ов use Getopt::Long; use Digest::MD5; use Term::ANSIColor qw(:constants); use IO::Handle; my $portagedir, $distdir, $listfile, $maxsize = -1, @files, @dig; my %distfiles = (), %digestfiles = (); my $pr = '\\', $total = 0; GetOptions("d=s" => \$distdir, "l=s" => \$listfile, "size" => \$size, "md5" => \$md5, "maxsize=i" => \$maxsize, "maxsize=s" => \$maxsize, "bzip2" => \$bz, "gzip" => \$gz, "delete" => \$delete, "verbose" => \$verbose, "silent" => \$silent); $gz = 1 if $listfile =~ s/\.gz$//; $bz = 1 if $listfile =~ s/\.bz2$//; if($gz) { $ext = "zcat"; $listfile =~ /\.gz$/ or $listfile .= ".gz"; } if($bz) { $ext = "bzcat"; $listfile =~ /\.bz2$/ or $listfile .= ".bz2"; } $distdir or $distdir = "/usr/portage/distfiles"; $listfile or $listfile = "listfile"; $ext or $ext = "zcat"; $listfile =~ /(\.gz)|(\.bz2)$/ or $listfile .= ".gz"; if($maxsize <= -1) { $maxsize = 10485760; # 10485760b = 10Mb } else { $maxsize =~ /^(\d+(\.\d)?)+\s*([GgMmKkBb])/; # lc $3; # не работает! почему?! if($3 eq 'G' or $3 eq 'g') { $maxsize = $1 * 1262485504; } elsif($3 eq 'M' or $3 eq 'm') { $maxsize = $1 * 1048576; } elsif($3 eq 'K' or $3 eq 'k') { $maxsize = $1 * 1024; } elsif($3 eq 'B' or $3 eq 'b' or not defined $3) { $maxsize = $1; } else { $maxsize = 10485760; } } @distdirs = split m#/*,#, $distdir; foreach $distdir(@distdirs) { opendir(DISTDIR, $distdir) or die "Не могу открыть директорию $distdir\n"; $distfiles{$_} = -s "$distdir/$_" foreach grep { !(/^\.$/) && !(/^\.\.$/) && -f "$distdir/$_" } readdir(DISTDIR); closedir DISTDIR; } -e $listfile or die "Нет файла $listfile\nЗапустите сначала ./genlist.pl\n"; open(DIGESTFILES, "$ext $listfile|") or die "Ошибка!\n"; @_ = <DIGESTFILES>; close DIGESTFILES; foreach(@_) { /^(\S+)\s+(\S+)\s+(\S+)/; # $1 - md5, $2 - имя, $3 - размер $hash = $2; $$hash{$3} = $1; } foreach my $file (keys %distfiles) { running(); unless(defined %$file) { (print "$file\n" and $total += $distfiles{$file}) unless $silent; system("rm $distdir/$file\n") if $delete; next; } if($md5 and exists $$file{$distfiles{$file}}) { next unless ($maxsize > $distfiles{$file} or $maxsize == 0); open(FILE, "<$distdir/$file") or (warn "Не могу открыть $distdir/$file\n" and next); binmode(FILE); print BOLD,"Неправильная md5-сумма файла ",RED,"$file\n",RESET unless scalar Digest::MD5->new->addfile(*FILE)->hexdigest eq $$file{$distfiles{$file}}; close FILE; next; } if($size and not exists $$file{$distfiles{$file}}) { @sizes = sort keys %$file; $ss1 = $distfiles{$file}; $ss2 = $sizes[$#sizes]; if(abs($ss2 - $ss1) >= 1262485504) { $ss1 = round($ss1, 3); $ss2 = round($ss2, 3); } elsif(abs($ss2 - $ss1) >= 1048576) { $ss1 = round($ss1, 2); $ss2 = round($ss2, 2); } elsif(abs($ss2 - $ss1) >= 1024) { $ss1 = round($ss1, 1); $ss2 = round($ss2, 1); } else { $ss1 = "$ss1 б"; $ss2 = "$ss2 б"; } $distfiles{$file} < $sizes[$#sizes] and print BOLD,"недокачен ",RESET,GREEN,"$file",RESET," - ",BOLD,BLUE,"$ss1",RESET," из ",BOLD,BLUE,"$ss2\n",RESET and next; $distfiles{$file} > $sizes[$#sizes] and print BOLD,"перекачен ",BOLD,GREEN,"$file",RESET," - ",BOLD,BLUE,"$ss1",RESET," из ",BOLD,BLUE,"$ss2\n",RESET and next; } } print BOLD," итого ",BLUE,round($total, 3),"\n",RESET unless $silent; exit 0; sub round { my ($v, $s) = @_; return (int($v / 1262485504)." Гб") if($s >= 3 and $v >= 1262485504); return (int($v / 1048576)." Мб") if($s >= 2 and $v >= 1048576); return (int($v / 1024)." Кб") if($s >= 1 and $v >= 1024); return ($v." б"); } sub running { if($pr eq '|') { $pr = '/'; } elsif($pr eq '/') { $pr = '-'; } elsif($pr eq '-') { $pr = '\\'; } elsif($pr eq '\\') { $pr = '|'; } print BOLD,RED," $pr\b\b\b",RESET; STDOUT->flush; }А вот genlist.pl
#!/usr/bin/perl # Генерим список файлов из digest'ов use Getopt::Long; use Term::ANSIColor qw(:constants); use IO::Handle; my $listfile, $portagedir, @dig, %files = (); my $pr = '\\'; GetOptions("p=s" => \$portagedir, "l=s" => \$listfile, "z=n" => \$zzz, "fast" => \$fast, "best" => \$best, "bzip2" => \$bz, "gzip" => \$gz, "verbose" => \$verbose); $zzz = 1 if $fast; $zzz = 9 if $best; $gz = 1 if $listfile =~ s/\.gz$//; $bz = 1 if $listfile =~ s/\.bz2$//; if($gz) { $arc = "gzip"; $listfile =~ /\.gz$/ or $listfile .= ".gz"; } if($bz) { $arc = "bzip2"; $listfile =~ /\.bz2$/ or $listfile .= ".bz2"; } $portagedir or $portagedir = "/usr/portage,/usr/local/portage"; $listfile or $listfile = "listfile"; $arc or $arc = "gzip"; $listfile =~ /(\.gz)|(\.bz2)$/ or $listfile .= ".gz"; $zzz or $zzz = 9; @portdirs = split (/,/, $portagedir); open(LISTFILE, "|$arc -$zzz -fc > $listfile") or die "Ошибка!\n"; push @digestfiles, glob("$_/*-*/*/files/digest-*") foreach @portdirs; foreach my $file (@digestfiles) { running(); unless(open(DIGEST, "<$file")) { warn "Не могу открыть файл $file\n"; next; } @dig = <DIGEST>; foreach(@dig) { chomp; s/^MD5\s+//; unless(exists $files{$_}) { $files{$_} = 1; print LISTFILE "$_\n"; } } close DIGEST; } close LISTFILE; sub running { if($pr eq '|') { $pr = '/'; } elsif($pr eq '/') { $pr = '-'; } elsif($pr eq '-') { $pr = '\\'; } elsif($pr eq '\\') { $pr = '|'; } print BOLD,RED," $pr\b\b\b",RESET; STDOUT->flush; }Это не с linuxshop'а?
Это не с linuxshop'а?
Мыло? Интересно, изменять могу, в профиле есть. А действительно как связываться? Это вопрос разработчикам.
"Чтобы попасть в Рай нужно переплыть Лету"
Станислав Ежи Лец
Re: Это не с linuxshop'а?
Мыло используется для того, чтобы высылать вам уведомления и пароли в случае их утери. Адреса на сайте не показываются в ваших же интересах - спамеры ведь не дремлют. :) Если есть желание, можно сделать текстовое поле для "публичного" email'а в профиле пользователя.
Если немного поковыряться можно сделать дополнительный тип поля для email'ов, чтобы они "шифровались" заменой символов на их цифровые коды (браузеры такое понимают, а сканеры страниц не все).
Я пока добавил поле ICQ в профиле в качестве временного решения.
поле для Jabber доб
поле для Jabber добавь :)
Ок. :)
[ done ]
Re: Это не с linuxshop'а?
Я имел ввиду как в phpBB2.
Ну уже несколько дней назад я установил модуль личных сообщений - уведомления оправляются автоматически.
Подойдет такой вариант? :)
Как эти пользоваться Крат
Вот как этим пользоваться:
хотя я пользуюсь только
./genlist.pl && ./clean.pl
./clean.pl --delete
Не знаю как у вас, а у меня genlist.pl ругается:
Не мудрено: строчка "
@dig = ;" ничего ни для меня ни для перла не значит.Что там должно было быть? Перла я не знаю, но вижу, что это скорее всего должен быть массив (список, или что там в перле есть) строк файла.
Re:
Там должны быть дискрипторы файлов. В genlist.pl - <DIGEST>, в clean.pl - <DIGESTFILES>
Просто форум поубирал эти слова, думая что это таги
У меня скрипт есть, который это может, но только там кроме этого еще много чего, собственно, наше локальное зеркало на нем и работает. Если надо могу прислать, только написан коряво слегка, и mysql ему нужен для ведения статистики и для определения старых дистфайлов (если это питоновскими средствами делать, то медленно будет, решил не париться и через mysql сделать).
---
Gentoo / 2.6.12rc1 / kde-3.4 (sometimes fluxfox)
Забыл сказать - работает ТОЛЬКО с кешем портежей.
---
Gentoo / 2.6.12rc1 / kde-3.4 (sometimes fluxfox)
cleandistfiles-20040812.tar.gz
Если кому надо, свяжитесь со мной (аська\джаббер в профиле указаны) и я вам вышлю архив
---
GNU/Wonderland -- GNU/Страна чудес, страна, в которой вы часто бываете, но, в которую, что примечательно, не надо оформлять визу.
за скрипт
за скрипт спасибо.
на будущее:
в перле объявления переменных через my надо брать в скобки, если там много чего объявляется.
my ($listfile, $portagedir, @dig, %files) = ();
А в процедуре running код перебора палочки '/' пишется в одну строчку:
$pr = {'|'=>'/','/'=>'-','-'=>'\\','\\'=>'|'}->{$pr};
Чистка старых версий исходников
Вот такую штуку видел, ничего сказать не могу относительно работоспособности, сам не пробовал:
# mv /usr/portage/distfiles /usr/portage/distfiles.old
# mkdir -p /etc/portage
# echo local /usr/portage/distfiles.old > /etc/portage/mirrors
# emerge -ef world
# rm /etc/portage/mirrors
# rm -rf /usr/portage/distfiles.old
Не совсем оптимально.... это поместит в /usr/portage/distfiles те исходники софта, который у вас установлен... но если, к примеру, вы поставили irssi (соответствено, выкачали исходники), потом его удалили и решили почистить дистфайлз... в итоге вы потеряете сурсы irssi даже в том случае, если они еще новы... а если это не ирсси а иксы и вы решите их все же поставить?... ИМХО, небольшой скриптик, проходящийся по files/digest* (собственно вышерасположеный скрипт это и делает) и выдирающий от туда имя пакета (опционально размер и МД5) сверяющий с тем что имеется и удаляющий лишнее лучше справится с задачей...
З.Ы. Такой скрипт я написал всего за пару часов (правда там были некоторые "навороты" ;) ), думаю, кому это надо сделает тоже, задача НЕ из ряда сложных.
Краевая ситуация.
Есть некоторый снапшот дерева. И куча дистфайлов. После обновления дерева вероятность того что ни один дистфайл не соответсвует дереву невелика, но есть.. В результате скрипт очистки (если конечно без выкрутасов) снесет все дистфайлы. Интересно, а что на это скажет deltup....
Вобщем не все так просто, нужно еще каким то образом сохранять самый свежий и небитый исходник, даже если его уже нет в дереве.. Тоесть само дерево не очень предназначено для подобных вещей.
Чистка старых версий портежей - обн
Это те которые выложены в топике сверху
http://den-linux.pisem.net/cleandistfiles/index.html
А если не удалять, а переносить?
ИМХО если старые distfiles не удалять, а переносить, то будет более гибко.