2010-11-23 5 views
2

見つけたら、ベース名(ディレクトリの数は不明)で出力をソートしたいと思います。私はdirnameからbasenameを分割してソートすることでこれを行うことができますが、ソートの前にデータを変更する必要がない場所を探しています。 sort --field-separator='/' -k '-1'のようなものです。ベース名でファイルをソート

答えて

0

単純にベース名を文字列の先頭に移動し、ソートして元に戻すという解決方法で解決しました。実際に私が望んでいたものではありませんが、それは奇妙なファイル名でも機能します。

1

この作業では、perlとカスタムソート機能を使用します。 basename_sort.pl以下のようにPerlコードを保存し、0755それをchmodの、そしてあなたは、このようなあなたのように、要求されてきたようにコマンドを実行することができます。もちろん

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

、あなたがあればどこかでそのユーティリティを移動したいと思いますそれは非常に頻繁にやります。さらに、.bashrcファイル内で関数をラップすることをお勧めします。 (トピックに載っていれば、そのコードは含まれていません)

#!/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

+0

basenameは大文字と小文字を区別しません。 – user502515

0

これは短く書くことができます。

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

まさに一種の神秘主義対実用主義の問題です。私はまだそれのsh関数を見たいと思います – zanlok

関連する問題