Страницы

Поиск по вопросам

среда, 10 апреля 2019 г.

Как отсортировать текстовый список файлов по расширению?

Есть файл log.txt. В этом файле содержится громадный список файлов и расширений, где каждое новое название начинается с новой строчки, приблизительно вот так:
1.jpg common.pdf script.sh Justin Bieber - Baby.mp3
Нужно перекинуть весь список в еще один файл, в котором список файлов будет упорядочен по расширению


Ответ

можно, например, воспользоваться программой sort, передав ей две опции:
указание использовать в качестве разделителя полей точку: -t. указание сортировать по второму полю: -k 2

$ sort -t. -k 2 исходный-файл > отсортированный-файл

уточнения: так называемые «расширения» файла пришли к нам из файловой системы fat16 (а в неё — из файловой системы для операционной системы cp/m), где это были отдельные сущности. с тех пор данное понятие присутствует лишь по традиции и довольно условно.
в операционных системах же системах unix и их «наследниках» (bsd, gnu и т.п.) этого понятия не существовало изначально: имя файла, например, file.tar.gz, — это цельная сущность, в ней нет никаких «расширений». да, строку .tar.gz можно считать «суффиксом» в имени файла. или даже двумя суффиксами: tar и gz
потому мой ответ и содержит предложение выделить в имени файла первую точку, подразумевая, что после неё и находится суффикс имени файла, или, в традиционно-устаревшей терминологии — «расширение».

если же всё-таки требуется сортировка по самому последнему суффиксу в имени файла, т.е., чтобы файл с именем a.z.a был раньше файла с именем a.b, то можно, например, воспользоваться такой конструкцией (она будет корректно работать при наличии любых символов в исходном файле, и вертикальной черты, и символа табуляции):
$ rev исходный-файл | sed -r 's/^([^.]+).*/&\t\1/' | rev | sort | cut -f 2- > отсортированный-файл

Комментариев нет:

Отправить комментарий