Как сортировать список путей к файлам по имени файла?

Не уверен, что существует универсальный метод, но для систем gnome -вы можете использовать этот вызов dbus:

dbus-send --print-reply --dest=org.gnome.Mutter.IdleMonitor /org/gnome/Mutter/IdleMonitor/Core org.gnome.Mutter.IdleMonitor.GetIdletime

Источник:https://dev.gajim.org/gajim/gajim/issues/8839

0
01.03.2021, 15:05
2 ответа
$ 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затем используется для удаления добавленного/-поля с разделителями.

Этот подход будет работать до тех пор, пока имя пути не содержит буквальный символ новой строки.

Также может возникнуть проблема, если какое-либо из имен путей заканчивается символом /(, возможно, это имя пути к каталогу ). Это даст пустую строку в столбце сортировки.

См. также:Преобразование Шварца

3
18.03.2021, 22:28

С помощью 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
0
18.03.2021, 22:28

Теги

Похожие вопросы