Listen Sie Dateien sortiert nach bestimmten Inhaltszeilen auf

Listen Sie Dateien sortiert nach bestimmten Inhaltszeilen auf

Ich habe ein Verzeichnis mit Dateien. In jeder Datei gibt es eine Zeile, die besagt:

# order: N

wobei N eine Ganzzahl ist. Ich möchte alle Dateien im Verzeichnis entsprechend dieser Zahl N auflisten (oder sie sogar in das Wrapper-Skript einbinden). Ist dies über eine Bash-Befehlszeile möglich?

Antwort1

Mit GNU grepund unter der Annahme, dass Dateinamen keine Doppelpunkte oder Zeilenumbruchzeichen enthalten:

$ 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

Antwort2

Mit einzelnen GNUawkVerfahren:

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

Antwort3

Mit zshkönnen Sie eine globale Sortierreihenfolge basierend auf dem Inhalt dieser Zeilen definieren mit:

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

und verwenden Sie es dann zum Beispiel mit:

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

oder

sorted_file_list=(*(.no+byOrder))

(und fügen Sie .dem Glob-Qualifizierer auch ein hinzu, um nurregulärDateien (keine Verzeichnisse, FIFOs, symbolische Links ...)).

verwandte Informationen