Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: nettezzaumana 26 Května 2009, 18:21:09
-
caues ..
jak se prosim `@foo = ("c", "a", "b/b/a", "b/c");` sesortuje ale s ohledem jako by to byly cesty .. nemuzu na to prijit ..
vysledek by mel bejt `@foo = "a", "c", "b/c", "b/b/a";` .. v `perldoc -f sort` to nejak nevidim, resp. nedokazu pochopit z prikladu ..
diky
-
abych vam usetril praci, tak nize je malej skriptik co to vypisuje nesortovane,, staci jen sesortovat v ramci `return @flist`
#!/usr/bin/env perl
use warnings;
use strict;
use File::Find;
sub build_flist {
my($fpath);
our(@flist);
$fpath = shift;
# chdir("$fpath");
@flist = "";
find(\&wanted, "$fpath");
sub wanted {
my($found);
$found = $File::Find::name;
push(@flist, "$found");
};
# return sort {
# $a =~ tr[/][] <=> $b =~ tr[/][] || $a cmp $b;
# } @flist;
return @flist;
};
my $action = $ARGV[0];
print "$_\n" foreach(build_flist("$action"));
exit;
order musi bejt nasledujici ::
$rootdir/$singlefiles .. ->
$rootdir/$dir1/$singlefiles .. ->
$rootdir/$dir1/$dir1/$singlefiles .. ->
$rootdir/$dir1/$dir2/$singlefiles .. ->
..
$rootdir/$dir2/$singlefiles .. ->
..
-
Z perldoc to nepochopím taky. Protože se rád pereš s věcmi tak říkám vyřeš si sám, ale přidám nějaké odkazy:
http://perl.eurohost.cz/associative.htm
http://www.usenix.org/publications/perl/perl01.html
-
to finalni sortovani je desne pomaly .. :/
#!/usr/bin/env perl
## prints a correct directory tree for given path
## usage: foo path d|f|a
use warnings;
use strict;
use File::Find;
our(@files, @dirs);
my($input, @final, $foo, $bar);
find(\&bingo, shift(@ARGV));
sub bingo {
$_ = $File::Find::name;
push(@files, $_) if -f;
push(@dirs, $_) if -d;
};
## now we'v got a separated list of files and dirs
@files = sort(@files);
@dirs = sort(@dirs);
#### playground:
while($input = shift(@ARGV)) {
if($input eq 'd') {
print "$_\n" foreach(@dirs);
next;
};
if($input eq 'f') {
print "$_\n" foreach(@files);
next;
};
if($input eq 'a') {
## sorting is *very *very slow ..
foreach(@dirs) {
$foo = $_;
push(@final, $foo);
foreach(@files) {
$bar = $_;
$bar =~ s@/.[^/]*$@@;
push(@final, $_) if($foo eq $bar);
};
};
print "$_\n" foreach(@final);
};
};
exit;
-
#!/usr/bin/perl
#!/usr/bin/perl
use warnings;
use strict;
use File::Find;
sub print_tree {
my $dir = shift;
my $pathname = [$_];
find ({ wanted => sub {
return if /^\.\.?$/;
printf "%s\n", join ('/', @$pathname, $_);
if (-d and not -l) {
push (@$pathname, $_);
}
},
preprocess => sub {
sort {
# Files sort before dirs
(-f $a ? (-f $b ? $a cmp $b : -1 ) : (-f $b ? 1 : $a cmp $b))
} @_
},
postprocess => sub {
pop (@$pathname);
},
}, $dir);
}
foreach (@ARGV) {
print_tree ($_);
}
-
Omlouvám se za mystifikaci, to co jsem odkazoval původně (http://forum.ubuntu.cz/index.php/topic,36047.msg266763.html#msg266763) je sice krásný příklad na sort podle dvou kritérií, ale...
Původně jsem zbrkle myslel mít pole s názvy souborů které by byly klíčem k folderům, jenže samotné názvy souborů by jako klíč nestačily, musela by někde být i "úroveň" zanoření. A úroveň zanoření ideálně číslovaná s nějakým oddělovačem, s neznámou hloubkou zanoření, takže pole.
Něco na způsob
"$rootdir/$singlefiles",0,0
"$rootdir/$dir1/$singlefiles",0,0,0
"$rootdir/$dir1/$dir1/$singlefiles",0,0,0,0
"$rootdir/$dir1/$dir2/$singlefiles",0,0,1,0
"$rootdir/$dir2/asinglefiles",0,1,0
"$rootdir/$dir2/bsinglefiles",0,1,1
"$rootdir/$dir2/csinglefiles",0,1,2
...
"$rootdir/$dir2/zzzsinglefiles",0,1,750
Kde při postupném procházení upravuješ jen index v příslušné úrovni zanoření a vysledkem je setřídění.
Tam jsem opět narazil na nutnost třídit soubory na stejné úrovni přednostně před folderama na téže úrovni a pak jsem si vzpomněl že jsem kdysi dávno něco s tříděním "soubory dříve než foldery" řešil, našel jsem to a pastnul sem.
A dnes jsem konečně vygooglil sice ne původní zdroj, ale téměř určitě původní skript (http://stackoverflow.com/questions/767879/script-to-navigate-a-directory-tree-and-print-the-file-names/768324#768324)
-
http://www.abclinuxu.cz/poradna/programovani/show/266500
^^ dekuji. vyreseno.