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 grep
und 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 GNUawk
Verfahren:
awk 'BEGIN{ PROCINFO["sorted_in"]="@val_num_asc" }
/order: [0-9]+/{ a[FILENAME]=$NF; nextfile }
END{ for(i in a) print i }' ./*
Antwort3
Mit zsh
kö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 ...)).