Хорошо, теперь это - больше напыщенная речь о Linux, чем вопрос, но возможно кто-то знает, как сделать то, что я хочу. Я знаю, что это может быть достигнуто с помощью sort
команда, но я хочу лучшее решение, потому что, заставляя это работать почти столь же легко как запись программы C, чтобы сделать то же самое.
У меня есть файлы для пользы аргументов, позволяет, говорят, что у меня есть эти файлы: (мои файлы являются тем же, у меня просто есть намного больше),
Теперь это оказывается порядком, в котором я хочу их отсортированный. Кстати, это - порядок в Windows, в который они по умолчанию отсортированы. Это хорошо. Группы Windows последовательные числовые символы в один эффективный символ, который виды в алфавитном порядке перед буквами.
Если я ввожу ls
в командной строке Linux я получаю следующий мусор. Заметьте, что эти 20 перемещены. Это - большее соглашение, когда у меня есть сотни этих файлов, которые я хочу просмотреть в отчете в порядке.
Я могу использовать ls -1 | sort -n -k 1.6
получить тех без 'k' или корректного 'M'...
Я могу использовать ls -1 | sort -n -k 1.7
не получить ни один из него корректный
Хорошо, прекрасный. Давайте действительно разберемся в нем. 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
Ух! Мальчик, довольный "питание командной строки 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;
}
Это было настолько трудно? Кто-то может поместить это в вид и отправить мне копию?Пожалуйста?
Это будет моя первая мысль:
ls -1 | sed 's/\-\([kM]\)\?\([0-9]\{2\}\)\./-\10\2./' | sort | sed 's/0\([0-9]\{2\}\)/\1/'
Обычно я просто использую sed
для добавления нулей в число, а затем снова использую его, чтобы удалить начальный ноль.
Я не знаю, может ли Perl быть быстрее.
ls -1v
даст вам довольно близкий результат. Он просто сортирует все заглавные буквы перед строчными.