Как отсортировать файлы численно из командной строки Linux

Хорошо, теперь это - больше напыщенная речь о Linux, чем вопрос, но возможно кто-то знает, как сделать то, что я хочу. Я знаю, что это может быть достигнуто с помощью sort команда, но я хочу лучшее решение, потому что, заставляя это работать почти столь же легко как запись программы C, чтобы сделать то же самое.

У меня есть файлы для пользы аргументов, позволяет, говорят, что у меня есть эти файлы: (мои файлы являются тем же, у меня просто есть намного больше),

  • file-10.xml
  • file-20.xml
  • file-100.xml
  • file-k10.xml
  • file-k20.xml
  • file-k100.xml
  • file-M10.xml
  • file-M20.xml
  • file-M100.xml

Теперь это оказывается порядком, в котором я хочу их отсортированный. Кстати, это - порядок в Windows, в который они по умолчанию отсортированы. Это хорошо. Группы Windows последовательные числовые символы в один эффективный символ, который виды в алфавитном порядке перед буквами.

Если я ввожу ls в командной строке Linux я получаю следующий мусор. Заметьте, что эти 20 перемещены. Это - большее соглашение, когда у меня есть сотни этих файлов, которые я хочу просмотреть в отчете в порядке.

  • file-100.xml
  • file-10.xml
  • file-20.xml
  • file-k100.xml
  • file-k10.xml
  • file-k20.xml
  • file-M100.xml
  • file-M10.xml
  • file-M20.xml

Я могу использовать ls -1 | sort -n -k 1.6 получить тех без 'k' или корректного 'M'...

  • file-k100.xml
  • file-k10.xml
  • file-k20.xml
  • file-M100.xml
  • file-M10.xml
  • file-M20.xml
  • file-10.xml
  • file-20.xml
  • file-100.xml

Я могу использовать ls -1 | sort -n -k 1.7 не получить ни один из него корректный

  • file-100.xml
  • file-10.xml
  • file-20.xml
  • file-k10.xml
  • file-M10.xml
  • file-k20.xml
  • file-M20.xml
  • file-k100.xml
  • file-M100.xml

Хорошо, прекрасный. Давайте действительно разберемся в нем. ls -1 | grep "file-[0-9]*\.xml" | sort -n -k1.6 && ls -1 file-k*.xml | sort -n -k1.7 && ls -1 file-M*.xml | sort -n -k1.7

  • file-10.xml
  • file-20.xml
  • file-100.xml
  • file-k10.xml
  • file-k20.xml
  • file-k100.xml
  • file-M10.xml
  • file-M20.xml
  • file-M100.xml

Ух! Мальчик, довольный "питание командной строки Linux", сохранил меня там. (Это не практично для моей ситуации, потому что вместо ls -1 У меня есть команда, которая является другой строкой или двумя длинными),

Теперь, поведение Windows просто, изящно, и делает то, что Вы хотите, чтобы оно сделало 99% времени. Почему у меня не может быть этого в Linux? Почему, о, почему делает sort не имеет "автоволшебный вид числа способом, который не заставляет меня ударить по голове в стену" переключатель?

Вот псевдокод для C++:

bool compare_two_strings_to_avoid_head_injury(string a, string b)
{
    string::iterator ai = a.begin();
    string::iterator bi = b.begin();
    for(; ai != a.end() && bi != b.end(); ai++, bi++)
    {
        if (*ai is numerical)
            gobble up the number incrementing ai past numerical chars;
        if (*bi is numerical)
            gobble up the number incrementing bi past numerical chars;
        actually compare *ai and *bi and/or the gobbled up number(s) here
            to determine if we need to compare more chars or can return the 
            answer now;
    }
    return something here;
}

Это было настолько трудно? Кто-то может поместить это в вид и отправить мне копию?Пожалуйста?

16
задан Scott 24 July 2010 в 03:14
поделиться

2 ответа

Это будет моя первая мысль:

ls -1 | sed 's/\-\([kM]\)\?\([0-9]\{2\}\)\./-\10\2./' | sort | sed 's/0\([0-9]\{2\}\)/\1/'

Обычно я просто использую sed для добавления нулей в число, а затем снова использую его, чтобы удалить начальный ноль.

Я не знаю, может ли Perl быть быстрее.

2
ответ дан 30 November 2019 в 15:28
поделиться

ls -1v даст вам довольно близкий результат. Он просто сортирует все заглавные буквы перед строчными.

16
ответ дан 30 November 2019 в 15:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: