Я произвел как это (алфавитно-цифровое):
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
Я думаю, что следующая команда приближается:
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