サブサブディレクトリ内のファイルの前に、サブディレクトリ内のファイルを一覧表示する必要があるようです。これは標準的な並べ替えではありません。アルゴリズムは、概念的には次のようにすべきだと思います。
- 2つのファイル名の間の最も長い共通の初期サブパスがで
X
ある場合、名前はとです。X/A
X/B
- 両方に1つ以上のスラッシュが含まれている場合は
A
、B
(A
とのB
)ストレートストリング比較を実行します。
- それ以外の場合、スラッシュ
A
も含まれていない場合は、(との)B
ストレート文字列比較を実行します。A
B
- それ以外の場合
A
、スラッシュが含まれていて含まれてB
いない場合は、のB
前に並べ替えますA
。
- それ以外の場合(
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