Сортировать вывод файла / папки в 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
Другие вопросы по тегам