Использование 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