Сортировка файлов по базовому имени - PullRequest
2 голосов
/ 23 ноября 2010

После поиска я бы хотел отсортировать вывод по базовому имени (количество каталогов неизвестно).Я знаю, что это можно сделать, отделив базовое имя от dirname и отсортировав его, но я специально ищу что-то, где нет необходимости изменять данные перед сортировкой.Что-то вроде sort --field-separator='/' -k '-1'.

Ответы [ 3 ]

1 голос
/ 23 ноября 2010

Для этой задачи я бы обратился к 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 голосов
/ 11 мая 2011

Закончилось решением простого перемещения базового имени в начало строки, сортировки и перемещения назад.Не совсем то, на что я надеялся, но оно работает даже с именами странных файлов.

0 голосов
/ 23 ноября 2010

Это можно написать короче.

find | perl -e 'print sort{($p=$a)=~s!.*/!!;($q=$b)=~s!.*/!!;$p cmp$q}<>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...