Сортировать вывод файла / папки в Bash
У меня есть вывод, как это (буквенно-цифровой):
bash /etc/file
bash /etc/filenew
bash /etc/skel/
bash /etc/skel/file
bash /etc/skel/filenew
bash /etc/skel/new/backups/
bash /etc/skel/new/file
bash /etc/skel/old/backups/
bash /etc/skel/old/file
bash /usr/
bash /usr/bin/
bash /usr/bin/file
bash /usr/sbin/
bash /usr/sbin/file.sbin
Который мне нужно отсортировать (сам вывод), чтобы сначала показать каталоги, согласно:
bash /etc/skel/
bash /etc/skel/new/backups/
bash /etc/skel/new/file
bash /etc/skel/old/backups/
bash /etc/skel/old/file
bash /etc/skel/file
bash /etc/skel/filenew
bash /etc/file
bash /etc/filenew
bash /usr/
bash /usr/bin/
bash /usr/bin/file
bash /usr/sbin/
bash /usr/sbin/file.sbin
1 ответ
Решение
Я думаю, что следующая команда подходит близко:
sed -r 's:([^/]*/):d\1:g; s:([^/]+)$:f\1:' foo.txt |
sort |
sed -r 's:/f:/:; s:d([^/]*/):\1:g'
Что оно делает? Первый sed
Команда добавляет d
в начале каждого каталога (ища строки, которые заканчиваются /
) и f
в файлы - те, которые не заканчиваются /
, Тогда мы применяем sort
- и с тех пор d
сортирует перед f
, каталоги сортируются первыми. Второй sed
отменяет первый.
Для примера ввода:
$ sed -r 's:([^/]*/):d\1:g; s:([^/]+)$:f\1:' foo.txt |
sort |
sed -r 's:/f:/:; s:d([^/]*/):\1:g'
bash /etc/skel/
bash /etc/skel/new/backups/
bash /etc/skel/new/file
bash /etc/skel/old/backups/
bash /etc/skel/old/file
bash /etc/skel/file
bash /etc/skel/filenew
bash /etc/file
bash /etc/filenew
bash /usr/
bash /usr/bin/
bash /usr/bin/file
bash /usr/sbin/
bash /usr/sbin/file.sbin