Sort как и с чем использовать для сортировки данных в Linux

Использование sort вместе с find — это классика автоматизации. Главная хитрость здесь в том, что find должен выдать данные в таком формате, который sort сможет понять (например, дату в секундах или размер).

Вот основные сценарии:

1. Сортировка по времени (Самое частое)

Чтобы отсортировать файлы от старых к новым, нужно попросить find вывести время в секундах (%T@ или %Z), а затем сказать sort сортировать числа (-n).

bash

find . -maxdepth 1 -type f -printf "%T@ %p\n" | sort -n

Используйте код с осторожностью.

  • %T@ — время последней модификации в секундах (Unix timestamp).
  • sort -n — числовая сортировка.
  • Чтобы последние (новые) файлы были внизу, добавьте -r (реверс): sort -nr.

2. Сортировка по размеру

bash

find . -maxdepth 1 -type f -printf "%s %p\n" | sort -n

Используйте код с осторожностью.

  • %s — размер файла в байтах.
  • Самые тяжелые файлы окажутся в самом низу списка.

3. Сортировка по алфавиту (имена файлов)

Если имен много и они сложные, просто передайте вывод в sort:

bash

find /etc -maxdepth 1 -type f | sort

Используйте код с осторожностью.


Важный нюанс: Проблема пробелов (режим Pro)

Если в именах файлов есть пробелы, обычный вывод через \n (новую строку) может «сломать» последующую обработку. Профессионалы используют нулевой символ (\0):

bash

find . -type f -printf "%T@ %p\0" | sort -z -n | xargs -0 echo

Используйте код с осторожностью.

  • -printf "...\0" — разделяет файлы нулевым байтом.
  • sort -z — говорит сорту работать с нулевым разделителем.
  • xargs -0 — корректно читает этот список.

4. Как это совместить с вашим массивом?

Если вы хотите загрузить в массив отсортированные по времени файлы:

bash

# Сортируем по ctime (изменение статуса) и берем только имена файлов (2-я колонка)
mapfile -t my_array < <(find . -maxdepth 1 -type f -printf "%Z %p\n" | sort -n | awk '{print $2}')

for item in "${my_array[@]}"; do
    echo "Обработка: $item"
done

Используйте код с осторожностью.

Шпаргалка по флагам sort:

  • -n — сортировать как числа (чтобы «10» было больше «2»).
  • -r — развернуть (обратный порядок).
  • -k 2 — сортировать по второй колонке (если в первой, например, дата).
  • -h — понимать человеческие размеры (2K, 1G) — работает, если find выдает их через дополнительные команды. [1], [5]

Пример

root@ruvds-rcuc4:~# find . -maxdepth 1 -type f -ls | sort -k 7 -r
26602 12 -rw------- 1 root root 8432 Jan 28 15:00 ./.bash_history
1165 4 -rw-r--r-- 1 root root 3106 Apr 22 2024 ./.bashrc
472 4 -rw-r--r-- 1 root root 2312 Apr 28 2024 ./bash.bashrc
1881 4 -rw------- 1 root root 171 Jan 28 15:59 ./.Xauthority
1166 4 -rw-r--r-- 1 root root 161 Apr 22 2024 ./.profile
1907 4 -rw-r--r-- 1 root root 104 Jan 23 14:59 ./file.txt
48 4 -rw-r--r-- 1 root root 64 Apr 28 2024 ./.bash_profile
26802 4 -rwxr-xr-x 1 root root 44 Jan 17 19:54 ./file2.sh
26600 4 -rwxr-xr-x 1 root root 38 Jan 17 19:52 ./file1.sh
806 4 -rw------- 1 root root 20 Jan 28 07:09 ./.lesshst
26601 4 -rw-r--r-- 1 root root 14 Jan 17 11:46 ./greeting.txt
26805 4 -rwxr-xr-x 1 root root 11 Jan 17 20:15 ./f11.sh
26803 4 -rwxr-xr-x 1 root root 11 Jan 17 19:59 ./f1.sh

Оставьте комментарий