2010-11-23 76 views
2

找到後,我想按基本名排序輸出(目錄數量未知)。我知道這可以通過拆分dirname中的基本名稱並對其進行排序來完成,但是我特意尋找某種不需要在排序前修改數據的內容。類似sort --field-separator='/' -k '-1'按基本名排序文件

回答

0

結束了一個解決方案,只需將基本名稱移動到字符串的起始位置,排序並將其移回。不是我真正希望的,但它甚至可以用怪人的文件名稱。

1

對於這個任務,我會轉向perl和使用自定義排序功能。下面保存Perl代碼爲basename_sort.pl,文件模式是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); 
} 
+0

p.s.是的,這個basename_sort()函數可以用匿名塊和其他perl句法神祕主義來縮寫或消除..但是,它們都是嚴格的,並且爲了最佳的清晰度/簡單性而拼寫出大小寫不敏感。 – zanlok 2010-11-23 12:30:37

+0

雖然basename並不意味着通常不區分大小寫。 – user502515 2010-11-23 12:40:47

0

這可以寫得更短。

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