代码之家  ›  专栏  ›  技术社区  ›  l0b0

按基名称对文件排序

  •  2
  • l0b0  · 技术社区  · 14 年前

    查找之后,我想按basename对输出进行排序(目录数量未知)。我知道这可以通过从dirname中分离basename并对其进行排序来完成,但是我特别寻找在排序之前不需要修改数据的地方。有点像 sort --field-separator='/' -k '-1' .

    3 回复  |  直到 14 年前
        1
  •  1
  •   zanlok    14 年前

    对于这个任务,我将转向perl和自定义排序函数的使用。将下面的perl代码保存为basename_sort.pl,chmod it 0755,然后可以执行您请求的命令,如下所示:

    find | grep "\.php" | ./basename_sort.pl
    

    当然,如果你经常这么做的话,你会想把这个工具移到别的地方。更好的是,我还建议在.bashrc文件中围绕它包装一个函数。(继续讨论主题,不包括该主题的sh代码)

    #!/usr/bin/perl
    
    use strict;
    
    my @lines = <STDIN>;
    @lines = sort basename_sort @lines;
    foreach( @lines ) {
       print $_;
    }
    
    sub basename_sort() {
       my @data1 = split('/', $a);
       my @data2 = split('/', $b);
       my $name1 = $data1[@data1 - 1];
       my $name2 = $data2[@data2 - 1];
       return lc($name1) cmp lc($name2);
    }
    
        2
  •  0
  •   user502515    14 年前

    这可以写得短一些。

    find | perl -e 'print sort{($p=$a)=~s!.*/!!;($q=$b)=~s!.*/!!;$p cmp$q}<>'
    
        3
  •  0
  •   l0b0    13 年前

    最后得到了一个简单的解决方案:将基名称移到字符串的开头,进行排序,然后将其移回。并不是我所希望的那样,但它甚至可以处理奇怪的文件名。