Ищете новый способ организации своих файлов и выполнения над ними каких-либо операций? Тем, кто работает с компьютерами, часто надо что-то отсортировать. Например, список файлов. Сортировка файлов с помощью Bash-команд sort и ls поможет вам навести порядок в своих материалах. Здесь мы поговорим об основах сортировки файлов и их содержимого в Linux.



Предварительные требования


Тут, при разборе примеров, используется Ubuntu 20.04, но вам, для того чтобы попробовать то, о чём мы будем говорить, подойдёт любой дистрибутив Linux.

Алфавитная сортировка файлов


Существует множество способов сортировки файлов в Linux. Предлагаю начать с самого распространённого способа — с сортировки файлов по алфавиту.

Запустите терминал и выполните команду ls -l, показанную ниже, чтобы получить список файлов, находящихся в директории, отсортированных по имени в восходящем порядке. Флаг -l сообщает команде ls о том, что ей нужно вывести данные в виде списка, содержащего подробные сведения о файлах.

ls -l


Алфавитная сортировка файлов

Команда ls по умолчанию выводит файлы с сортировкой их по алфавиту в восходящем порядке. Для того чтобы обратить порядок сортировки — нужно передать этой команде флаг -r. Например, это может выглядеть как ls -lr. Передача флага -r команде ls возможна и в примерах, рассмотренных ниже.

Сортировка файлов по размеру


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

Для того чтобы отсортировать файлы по размеру — команде ls надо передать флаг -S.

Вот команда, которая позволяет отсортировать файлы по размеру и вывести список файлов с их подробным описанием.

ls -lS

Эта команда, как показано ниже, выведет список файлов, отсортированных от больших файлов к меньшим. Для того чтобы обратить порядок сортировки — воспользуйтесь флагом -r. Выглядеть это может как ls -lSr.


Сортировка файлов по размеру

Сортировка файлов по времени их модификации


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

Для сортировки файлов по времени модификации команде ls можно передать параметр -t.

ls -lt


Сортировка файлов по времени модификации

Сортировка файлов по расширению


Если вам нужен файл определённого типа, в деле по его поиску вам может очень хорошо помочь сортировка файлов по расширению.

Тут нам снова пригодится команда ls. На этот раз — с флагом -X.

ls -lX


Сортировка файлов по расширению

Обратите внимание на то, что эта команда, выводя группу файлов с одним и тем же расширением, сортирует файлы в пределах этой группы по именам в восходящем порядке.

Сортировка содержимого текстового файла


Теперь вы уже знаете немало способов сортировки файлов. Поэтому давайте переключим внимание с команды ls на команду sort. Эта команда позволяет сортировать содержимое файлов, руководствуясь переданными ей флагами. Правда, прежде чем опробовать эту команду, нам понадобится файл, содержимое которого мы будем сортировать.

Выполните следующую команду, для того чтобы создать файл с именем fruits.txt, содержащий названия фруктов. Флаг -e позволяет интерпретировать обратную косую черту в конструкции \n, благодаря чему каждое слово будет идти с новой строки.

echo -e "apple \nmango \nwatermelon \ncherry \norange \nbanana" > fruits.txt

Теперь выполните следующую команду, для того чтобы отсортировать слова в этом файле.

sort fruits.txt

Ниже показано содержимое файла, отсортированное по алфавиту в восходящем порядке.


Сортировка содержимого файла по алфавиту в восходящем порядке

Команда sort, без флагов, сортирует содержимое файлов в восходящем порядке. Для того чтобы обратить порядок сортировки — воспользуйтесь флагом -r. Соответствующая команда может выглядеть как sort -r fruits.txt. Сортировка данных в обратном порядке с применением -r может быть выполнена и в других рассмотренных тут примерах применения sort.

Сортировка списка чисел в текстовом файле


Для сортировки списков чисел в файлах используется та же команда sort, но — с флагом -n. Чтобы опробовать это на практике — создадим файл scores.txt, в каждой строке которого будет одно число, выбранное мной случайным образом. Вот команда для создания такого файла:

echo -e "45 \n69 \n52 \n21 \n3 \n5 \n78" > scores.txt

Теперь, чтобы отсортировать числа в этом файле, выполним следующую команду.

sort -n scores.txt


Сортировка чисел в файле

Видно, что числа, находящиеся в файле, отсортированы от самого маленького к самому большому.

Сортировка списка номеров версий программы в текстовом файле


Возможно, у вас есть файл с номерами версий программы, содержимое которого вы хотите отсортировать. Для того чтобы это сделать — нам понадобится всё та же команда sort, но теперь — с опцией --version-sort.

Создадим, как обычно, файл, на котором будем экспериментировать. Это будет versions.txt, в каждой строке которого имеется номер версии.

echo -e "1.0.0.1 \n 6.2.1.0 \n4.0.0.2" > versions.txt

Теперь выполним команду такого вида:

sort --version-sort --field-separator=. versions.txt

Здесь имеется новая опция — --field-separator, которая сообщает команде sort о том, что части каждого из номеров разделены точкой. В качестве разделителя полей можно указать любой символ, который разделяет поля номеров версий, хранящиеся в файле.


Сортировка номеров версий в файле

Поиск файлов с заданным расширением и их сортировка


В предыдущих примерах мы решали наши задачи с помощью запуска какой-то одной команды (ls или sort). Но при работе в Linux часто возникает необходимость совместного использования двух или большего количества команд. Как это сделать? Сделать это можно с помощью конвейера команд, перенаправляющего выходные данные одной команды на вход другой команды.

Следующая конструкция позволит найти (команда find) все markdown-файлы (-iname «*.md») в рабочей директории (.) и отсортировать их по алфавиту в нисходящем порядке (sort -r). Попробуйте поискать и посортировать другие файлы, меняя расширение «*.md» на какое-то другое.

find . -iname "*.md" | sort -r


Поиск и вывод нужных файлов с сортировкой их по алфавиту в нисходящем порядке

Если вам удобнее сохранить то, что получится, в файл, а не выводить в консоль, воспользуйтесь опцией --output команды sort. В результате, например, может получиться такая конструкция: find . -iname «*.md» | sort -r --output=sorted.txt. В данном случае отсортированный список найденных файлов попадёт в файл sorted.txt.

Итоги


Я написал эту статью для того, чтобы показать всем желающим различные возможности по сортировке файлов с помощью Bash-команд в Linux. Теперь вы знаете о том, как сортировать списки файлов и то, что содержится в файлах. Вы теперь умеете создавать конвейеры из команд для выполнения более сложных операций сортировки файлов. И, кстати, обладая этими знаниями, вы вполне можете написать скрипты, которые автоматизируют задачи сортировки файлов и содержимого файлов.


НЛО прилетело и оставило здесь промокоды для читателей нашего блога:

15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

— 20% на выделенные серверы AMD Ryzen и Intel Core HABRFIRSTDEDIC.

Доступно до 31 декабря 2021 г.

Комментарии (7)


  1. Zeiram
    29.10.2021 16:52
    -5

    Полезненько. В Копилку! :)


  1. astenix
    30.10.2021 06:55
    +2

    Сортировка списков чисел в файле командой sort с флагом -n выводит результат в консоль. Если захочешь сохранить этот результат в этот же файл, можно сделать

    sort -n scores.txt > scores.txt

    Результат: пустой файл scores.txt…

    Надо было делать вывод в файл scores2.txt


    1. red_led
      30.10.2021 11:18
      +1

      Или использовать sponge.


      1. astenix
        30.10.2021 20:57

        sort -n scores.txt | sponge scores.txt

        Да, так хорошо.


  1. antonbatenev
    31.10.2021 15:52

    Запустите терминал и выполните команду ls -l, показанную ниже, чтобы получить список файлов, находящихся в директории, отсортированных по имени в восходящем порядке.

    Тут стоит обратить внимание, что порядок сортировки будет определяться текущей локалью:

    $ LC_ALL=C ls -1
    TEST.txt
    test.txt
    $ LC_ALL=ru_RU.UTF-8 ls -1
    test.txt
    TEST.txt

    и конструкции вида ls -1 | head -n 1 - поле для сбора урожая.


  1. karavan_750
    31.10.2021 17:45

    Сортировка IP(v4):

    sort -n -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4

    Где, -t -- краткая форма флага для указания разделителя, -k -- флаг задающий диапазон сортируемых полей, если его не указать для каждого октета , то адрес 192.168.33.5 будет в списке результатов следовать перед адресом 192.168.5.1


  1. BigSnow
    09.11.2021 01:35

    Интереснеько