您似乎希望将子目录中的文件列在子目录中的任何文件之前。这根本不是一个标准的排序。我认为该算法在概念上应该是:
- 如果两个文件名之间最长的公共初始子路径是
X
,则名称是X/A
和X/B
。
- 如果两者都
A
包含B
一个或多个斜杠,则进行直字符串比较(ofA
和B
)。
- 否则,如果既不
A
也不B
包含斜线,则进行直字符串比较(ofA
和B
)。
- 否则,如果
A
包含斜线B
且不包含斜线,则在 .B
之前排序A
。
- Else (
B
包含一个斜线并且A
没有,所以) 排序A
在 之前B
。
在样本数据中:
- F1 =
./lib/app/b/file
- F2 =
./lib/app/config.json
- F3 =
./lib/app/d/file
- F4 =
./lib/app/b/a/file
- F5 =
./lib/app/b/other
比较:
Names X A B Rule Result
F1, F2 ./lib/app/ b/file config.json 4 F2 < F1
F1, F3 ./lib/app/ b/file d/file 2 F1 < F3
F1, F4 ./lib/app/b/ file a/file 5 F1 < F4
F1, F5 ./lib/app/b file other 3 F1 < F5
F2, F3 ./lib/app/ config.json d/file 5 F2 < F3
F2, F4 ./lib/app/ config.json b/a/file 5 F2 < F4
F2, F5 ./lib/app/ config.json b/other 5 F2 < F5
F3, F4 ./lib/app/ d/file b/a/file 2 F4 < F3
F3, F5 ./lib/app/ d/file b/other 2 F5 < F3
F4, F5 ./lib/app/b a/file other 3 F5 < F3
在 Perl 中编码:
#!/usr/bin/env perl
use strict;
use warnings;
my @files;
while (<>)
{
chomp;
push @files, $_;
}
sub pathsorter
{
my(@abits) = split /\//, $a;
my(@bbits) = split /\//, $b;
my $na = scalar(@abits);
my $nb = scalar(@bbits);
my $nbits = (($na < $nb) ? $na : $nb) - 1;
my $i;
for ($i = 0; $i < $nbits; $i++)
{
last if ($abits[$i] ne $bbits[$i]);
}
# abits[0..$i] == bbits[0..$i] == X
return $a cmp $b if ($i < $nbits);
return $a cmp $b if ($na == $nb && $i == $nbits);
return -1 if ($na < $nb);
return +1 if ($na > $nb);
return 0;
}
print "$_\n" foreach (sort pathsorter @files);
输入:
./lib/app/b/file
./lib/app/config.json
./lib/base/basename
./lib/app/d/file
./lib/app/b/a/file
./lib/app/b/other
./lib/app/animosity
./lib/base/basename
输出:
./lib/app/animosity
./lib/app/config.json
./lib/app/b/file
./lib/app/b/other
./lib/app/b/a/file
./lib/app/d/file
./lib/base/basename
./lib/base/basename