Не уверен, что существует универсальный метод, но для систем gnome -вы можете использовать этот вызов dbus:
dbus-send --print-reply --dest=org.gnome.Mutter.IdleMonitor /org/gnome/Mutter/IdleMonitor/Core org.gnome.Mutter.IdleMonitor.GetIdletime
$ awk -F '/' '{ printf "%s/%s\n", $NF, $0 }' files.txt | sort | cut -d '/' -f 2-
./COPYRIGHT.txt
./MAINTAINERS.txt
./README.txt
./themes/seven/images/arrow-desc.png
./themes/seven/images/arrow-prev.png
./themes/seven/images/fc-rtl.png
./themes/seven/ie7.css
./themes/seven/images/list-item-rtl.png
./update.php
./web.config
./xmlrpc.php
Это добавляет копию имени файла в начало строки, за которой следует символ /
. Имя файла получается из последнего/
-поля с разделителями. Последнее поле — $NF
в awk
.
Вывод команды awk
сортируется. Эта сортировка будет использовать поле с разделителем /
-, добавленное в начало строки. cut
затем используется для удаления добавленного/
-поля с разделителями.
Этот подход будет работать до тех пор, пока имя пути не содержит буквальный символ новой строки.
Также может возникнуть проблема, если какое-либо из имен путей заканчивается символом /
(, возможно, это имя пути к каталогу ). Это даст пустую строку в столбце сортировки.
См. также:Преобразование Шварца
С помощью GNU awk(gawk
)один из моих определенных обходов массива:
awk -F'/' 'BEGIN {PROCINFO["sorted_in"] = "@ind_str_asc"}
{ a[$NF]=$0 }
END { for ( i in a ) { print a[i] } }' files.txt
В этом случае :загружать данные в массив, индексы определяются последним/
-разделенным полем (т.е. именем файла ), элементами являются строки файла. Затем пройдитесь по массиву, отсортированному по значению индекса для шага печати.
Только базовые утилиты:
paste <(rev files.txt | cut -d'/' -f 1 | rev) files.txt | sort | cut -f2