Список файлов, отсортированных по определенной строке содержимого

Список файлов, отсортированных по определенной строке содержимого

У меня есть каталог файлов. В каждом файле есть строка, которая гласит:

# order: N

где N — целое число. Я хочу перечислить все файлы в каталоге (или даже включить их в скрипт-оболочку) в соответствии с этим числом N. Возможно ли это из командной строки bash?

решение1

С GNU grepи при условии, что имена файлов не содержат двоеточия или символы новой строки:

$ ls
bar     baz     foo     freeble quux
$ cat ./*
# order: 3
# order: 2
# order: 1
# order: 4
# order: 5
$ grep -m1 -EH '^# order: [0-9]+$' ./* | sort -n -k3 | cut -d: -f1
foo
baz
bar
freeble
quux

решение2

С одним GNUawkпроцесс:

awk 'BEGIN{ PROCINFO["sorted_in"]="@val_num_asc" }
     /order: [0-9]+/{ a[FILENAME]=$NF; nextfile }
     END{ for(i in a) print i }' ./*

решение3

С помощью zshможно определить порядок сортировки глобусов на основе содержимого этих строк:

byOrder() REPLY=$(grep '^# order:' < $REPLY)

а затем использовать его, например, с:

printf '%s\n' *(.no+byOrder)

или

sorted_file_list=(*(.no+byOrder))

(также добавляя .к квалификатору glob, чтобы учитывать толькообычныйфайлы (не каталоги, fifo, символические ссылки...)).

Связанный контент