Forum Webscript.Ru

Программирование => Perl => Тема начата: domashniy от 24 Февраля 2005, 12:54:39

Название: сортировка файлов в каталоге
Отправлено: domashniy от 24 Февраля 2005, 12:54:39
Естьт такая проблема,  не програмер я и тяжко, помогите.
Нужно отсортировать все файлы в каталоге по убыванию, если известно что 2 первых слова постоянны, а меняется только 3-е слово (чило) (example.tests.1.zip, example.tests.2.zip)
После того как отсортируется, нужно запустить програму и выполнить разорхивирование, начиная с самого большого чилса и до самого маленького.
Прочитал тут кучу примеров, вроде все просто и понятно, но так ничего и не получилось.
Название: сортировка файлов в каталоге
Отправлено: commander от 24 Февраля 2005, 13:26:26
domashniy
Цитировать
Нужно отсортировать все файлы в каталоге по убыванию

Цитировать
После того как отсортируется, нужно запустить програму и выполнить разорхивирование

 сам то понял что написал? :)

сформулируй вопрос правильно...
Название: сортировка файлов в каталоге
Отправлено: domashniy от 24 Февраля 2005, 13:36:17
есть каталог и внем такие файлы
example.tests.1.zip
example.tests.2.zip
example.tests.3.zip
example.tests.4.zip
нужно прочесть все фалы из этот каталого с расширением .zip
дальше разархивировать все эти фалы по убыванию циферок, т.е.
pkunzip example.tests.4.zip
pkunzip example.tests.3.zip
pkunzip example.tests.2.zip
pkunzip example.tests.1.zip
Название: сортировка файлов в каталоге
Отправлено: commander от 24 Февраля 2005, 13:42:49
domashniy
и это все сделать одним перловым скриптом?
если да... :
то ещё скажи какая у тебя платформа (Unix/Win)?
Название: сортировка файлов в каталоге
Отправлено: domashniy от 24 Февраля 2005, 13:50:57
win, но можно и под unix
Название: сортировка файлов в каталоге
Отправлено: commander от 24 Февраля 2005, 14:02:53
domashniy
1. opendir #perldoc -f opendir
2. readdir #perldoc -f readdir
3. sort #perldoc -f sort
4. use Shell #perldoc Shell (http://search.cpan.org/~nwclark/perl-5.8.6/lib/Shell.pm)
5. closedir #perldoc -f closedir
если что не понятно... могу подробнее прокоментировать...
Название: сортировка файлов в каталоге
Отправлено: domashniy от 24 Февраля 2005, 14:31:34
ага я рад что ты умеешь пользоваться манами, более того наверно и писать умееш по этим манам, и что ?.....
Название: сортировка файлов в каталоге
Отправлено: NeoNox от 24 Февраля 2005, 14:54:58
domashniy за тебя написать?
Название: сортировка файлов в каталоге
Отправлено: synthez от 24 Февраля 2005, 17:13:38
domashniy
а зачем их разпаковывать в по убыванию? =)
Название: сортировка файлов в каталоге
Отправлено: AnnA от 24 Февраля 2005, 17:53:22
действительно непонятно
Цитировать
synthez:
зачем их разпаковывать в по убыванию

а в остальном вот Вам пример:
#!/usr/bin/perl

opendir (G,\'./\') or die $!; @z=grep (/\\.zip/i,readdir G); closedir(G);
print "\\n\\n";
print for sort by_n @z;

sub by_n  { my $aa=(split(/\\./,$b))[2]; my $ab=(split(/\\./,$a))[2]; return ($aa <=> $ab); }
Название: сортировка файлов в каталоге
Отправлено: synthez от 24 Февраля 2005, 18:35:01

#!/usr/bin/perl -w
use strict;

my (@list);

while (my $file = <*.zip>)
{
push @list, $file;
}

foreach my $tmp (reverse @list)
{
my $dir = $tmp;
$dir =~ s/\\.zip$//;
system("unzip", "-x", $tmp, "-d", "./$dir");
}

может так?
Название: сортировка файлов в каталоге
Отправлено: domashniy от 25 Февраля 2005, 07:11:11
AnnA
да я почти так же делал, только более нагромажденно и неумело.
Но вот ваш пример не сортирует, вот что получил
a.b.1.zip a.b.10.zip a.b.12.zip a.b.15.zip a.b.2.zip a.b.3.zip a.b.4.zip a.b.5.zip a.b.6.zip a.b.7.zip a.b.8.zip a.b.9.zip
а нужно так
a.b.15.zip a.b.12.zip a.b.10.zip a.b.9.zip a.b.8.zip a.b.7.zip a.b.6.zip a.b.5.zip a.b.4.zip a.b.3.zip a.b.2.zip a.b.1.zip
NeoNox
да именно написать, как я уже выша сказал я не умею програмировать, и если вы тут все програмеры, то почему бы не помочь ? больше пустых разговоров...ведь написать как AnnA пару строк кода не сложно? да ведь ?
Название: сортировка файлов в каталоге
Отправлено: synthez от 25 Февраля 2005, 09:23:19
domashniy
да зачем тебе чтобы они лежали отсортированые по убыванию?
смотрятся что ли красивее?
Название: сортировка файлов в каталоге
Отправлено: domashniy от 25 Февраля 2005, 09:56:13
мне не нужно чтобы они лежали отсортированными ;)) мне нужно их разархивировать в таком отсортированном порядке, а после еще и обработать уже распакованные файлы.
Но сейчас для меня самая большая проблема что не сортируется ;(((
спасибо за пример, но это немножко не то что мне нужно.
Название: сортировка файлов в каталоге
Отправлено: AnnA от 25 Февраля 2005, 11:50:26
domashniy
очень странно. смотрите:#!/usr/bin/perl

#opendir (G,\'./\') or die $!; @z=grep (/\\.zip/i,readdir G); closedir(G);
@z=qw(a.b.1.zip a.b.10.zip a.b.12.zip a.b.15.zip a.b.2.zip a.b.3.zip a.b.4.zip a.b.5.zip a.b.6.zip a.b.7.zip a.b.8.zip a.b.9.zip);
print "\\n\\n";
print "\\n", $_ for sort by_n @z;

sub by_n  { my $aa=(split(/\\./,$b))[2]; my $ab=(split(/\\./,$a))[2]; return ($aa <=> $ab); }
perl readdir.cgi
a.b.15.zip
a.b.12.zip
a.b.10.zip
a.b.9.zip
a.b.8.zip
a.b.7.zip
a.b.6.zip
a.b.5.zip
a.b.4.zip
a.b.3.zip
a.b.2.zip
a.b.1.zip

А приведенный Вами листинг файлов получается, если воспользоваться вариантом
synthez
или в моем примере убрать by_n, т.е. написать так:
print "\\n", $_ for sort @z; а не так, как было:
print "\\n", $_ for sort by_n @z;
мой пример полностью рабочий. видимо Вы что-то «нахимичили» коприуя или подключая его. :) может покажете весь кусочек кода, который выдал Вам такой листинг файлов, а то гадать - дело неблагодарное. ;)
Название: сортировка файлов в каталоге
Отправлено: commander от 25 Февраля 2005, 12:11:13
AnnA
вы сортируете строковую переменную... а ждете результата сортировки числовой... - этого не будет...

P.S. use strict; где???!!!!
Название: сортировка файлов в каталоге
Отправлено: domashniy от 25 Февраля 2005, 12:24:40
то АннА.
Для тестов я сделал отдельный кусок, куда вставил полностью ваш скрипт.
Как первый ваш варинат, так и второй не сортирует.
Может проблема в том что запускаю под Виндами ?
Название: сортировка файлов в каталоге
Отправлено: AnnA от 25 Февраля 2005, 12:32:16
commander
ну что Вам сказать. ;) посмотрите код еще раз, что ли...
Цитировать
commander:
этого не будет

есть. ;)
приведите последовательность файлов для которой он бы не работал? с условием, что второе значение после точки есть цифра. (a.b.1.zip)

P.S. для строковой переменной функция сортировки выглядела бы так: sub by_n  { ... return ($aa cmp $ab); }
Название: сортировка файлов в каталоге
Отправлено: commander от 25 Февраля 2005, 12:37:33
AnnA
от того что я посмотрю код ещё раз ситуация не поменяеться... ибо написал он НЕ ВЕРНО...
Название: сортировка файлов в каталоге
Отправлено: AnnA от 25 Февраля 2005, 12:43:51
domashniy
всё поняла. .)
злая шутка форума. вдруг задумалась - почему у меня работает а у Вас нет. Всё просто, форум скушал слеши (как он это обычно делает).
сейчас попробую дать правильный код
в обоих случаях перед точкой в split ДОЛЖЕН БЫТЬ ОБРАТНЫЙ СЛЭШ вот так (/\\./,$b))[2]
Название: сортировка файлов в каталоге
Отправлено: AnnA от 25 Февраля 2005, 12:46:28
Цитировать
commander:
ибо написал он НЕ ВЕРНО...
и где же именно?
Название: сортировка файлов в каталоге
Отправлено: domashniy от 25 Февраля 2005, 13:17:31
точно все правильно, это мой наверно косяк что не заметил такой простой вещи ;))
огромное спасибо все работает. вот как еще доделал для своих нужд, может что скажите как лучше

opendir (G,"$tmpdir") or die $!; @z=grep (/тутобратный слеш.zip/i,readdir G); closedir(G);
@x = sort by_n @z;
foreach (@x)
{
system `7za.exe e -o$tmplogs $tmpdir/$_`;
system `build.exe`;
}

sub by_n  { my $aa=(split(/\\./,$b))[2]; my $ab=(split(/\\./,$a))[2]; return ($aa <=> $ab); }
Название: сортировка файлов в каталоге
Отправлено: AnnA от 25 Февраля 2005, 13:42:07
domashniy на самом деле это commander подметил неувязочку. код, хоть и правильный, написан был неправильно. Я уже пару лет, как пользуюсь этим способом, а тут мне вдруг говорят, что он неправильный. ну вот и вспылила малость. :)
Название: сортировка файлов в каталоге
Отправлено: domashniy от 25 Февраля 2005, 13:48:10
а что в нем неправильного ?
Название: сортировка файлов в каталоге
Отправлено: AnnA от 25 Февраля 2005, 14:20:31
ну слэш же форум не показал. я и говорю - написан был неправильно. не верно отображён форумом. в результате получалось то, о чем совершенно справедливо заметил
Цитировать
commander:
вы сортируете строковую переменную... а ждете результата сортировки числовой

что дал мне лог, когда я скопировала свой же код из форума. т.е. сплит подавал на сорт не цифру а букву......
ну, в общем, «проехали». :)