Чистка старых версий портежей

Подскажите существует ли скриптик который правильно удалял бы старые версии сурсов. Т.е. допустим оставил бы эксперементальные и последние стабильные. "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'а?

SCIF написал(а):
Мыло? Интересно, изменять могу, в профиле есть. А действительно как связываться? Это вопрос разработчикам.

Мыло используется для того, чтобы высылать вам уведомления и пароли в случае их утери. Адреса на сайте не показываются в ваших же интересах - спамеры ведь не дремлют. :) Если есть желание, можно сделать текстовое поле для "публичного" email'а в профиле пользователя.
Если немного поковыряться можно сделать дополнительный тип поля для email'ов, чтобы они "шифровались" заменой символов на их цифровые коды (браузеры такое понимают, а сканеры страниц не все).
Я пока добавил поле ICQ в профиле в качестве временного решения.

поле для Jabber доб

поле для Jabber добавь :)

Ок. :)

[ done ]

Re: Это не с linuxshop'а?

Ustas написал(а):
Адреса на сайте не показываются в ваших же интересах - спамеры ведь не дремлют. :)

Я имел ввиду как в phpBB2.

Ну уже несколько дней назад я установил модуль личных сообщений - уведомления оправляются автоматически.
Подойдет такой вариант? :)

Как эти пользоваться Крат

Вот как этим пользоваться:

автор написал(а):
Краткое описание

На этой страничке вашему вниманию предоставлен скрипт, который показывает (по умолчанию, но может и удалить) distfiles'ы которых уже нет в файлах /usr/portage/*-*/*/files/digest-*
Файлы

cleandistfiles-20040812.tar.gz

Список изменений можно посмотреть здесь
Использование

Сперва нужно создать список файлов. Этим занимается скрипт genlist.pl. Делаем:

# ./genlist.pl

Это создаст файл listfile.gz, в котором находится содержимое всех digest'ов. Этот процесс сделан специально отдельно из-за его медленности. По умолчанию создаваемый файл сжимается gzip'ом и предыдущая строчка эквивалентна вот этой

# ./genlist.pl --gzip --best

или

# ./genlist.pl --gzip -z=9

Здесь выбирается gzip и степень сжатия 9, но можно выбрать bzip2, например,

# ./genlist.pl --bzip2 --fast

или

# ./genlist.pl -l=list.bz2

genlist.pl по имени файла сам выбирает архиватор.
После создания списка файла нужно сделать

# ./clean.pl
...
thunderbird-0.5-source.tar.bz2
aspell-0.50.4.1.tar.gz
ssmtp_2.60.4.tar.gz
swig-1.3.20.tar.gz
...
итого 142 Мб

Будет выведен список ненужный distfiles'ов. По умолчанию clean.pl файлы не удаляет и смотрит в listfile.gz Чтобы заставить его удалять и смотреть в другой файл нужно сделать

# ./clean.pl --delete -l=listfile.bz2

или

# ./clean.pl --delete --bzip2

Чтобы "тихо" (не засоряя терминалку) удалить файлы нужно сделать

# ./clean.pl --delete --silent

Чтобы вывести информацию о недокаченных или перекачанных 8) файлов и не выдавать ненужные distfiles'ы нужно сделать

 ./clean.pl --size --silent
перекачен linux-2.6.1.tar.bz2 - 32527 Кб из 32460 Кб
недокачен thunderbird-source-0.6.tar.bz2 - 7 Мб из 30 Мб
недокачен xine-lib-1-rc5.tar.gz - 631 Кб из 6 Мб

Размер выдается, таким образом, чтобы не только их максимально округлить, но еще и увидеть разницу. Также можно сделать проверку md5-сумм:

# ./clean.pl --md5 --maxsize=12Mb
Неправильная md5-сумма файла linux-2.6.7.tar.bz2

Будет проведена проверка md5-сумм файлов, размер которых не превышает 12 Мб (по умолчанию 10Мб). Чтобы снять ограничение по размеру нужно задать 0, вот так:

# ./clean.pl --md5 --maxsize=0

Скрипты имеют опции для задания местонахождения portage и distfiles'ов, т.е.

# ./genlist.pl -p=/usr/portage,/usr/local/portage

и

# ./clean.pl -d=/usr/portage/distfiles

Эти значения устанавливаются по умолчанию.
Напоследок
Если найдёте ошибки или будут вопросы, предложения, то кидайте мне на почту

Пользуйтесь!..

хотя я пользуюсь только
./genlist.pl && ./clean.pl
./clean.pl --delete

Не знаю как у вас, а у меня genlist.pl ругается:

syntax error at ./distfiles-genlist.pl line 51, near "= ;"
Execution of ./distfiles-genlist.pl aborted due to compilation errors.

Не мудрено: строчка "@dig = ;" ничего ни для меня ни для перла не значит.

Что там должно было быть? Перла я не знаю, но вижу, что это скорее всего должен быть массив (список, или что там в перле есть) строк файла.

Re:

Гость написал(а):
Не знаю как у вас, а у меня genlist.pl ругается:

syntax error at ./distfiles-genlist.pl line 51, near "= ;"
Execution of ./distfiles-genlist.pl aborted due to compilation errors.

Не мудрено: строчка "@dig = ;" ничего ни для меня ни для перла не значит.

Что там должно было быть? Перла я не знаю, но вижу, что это скорее всего должен быть массив (список, или что там в перле есть) строк файла.

Там должны быть дискрипторы файлов. В 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 не удалять, а переносить, то будет более гибко.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".