特定の内容の行に従ってソートされたファイルをリストします

特定の内容の行に従ってソートされたファイルをリストします

ファイルのディレクトリがあります。各ファイルには次のような行があります:

# 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、次のように行の内容に基づいて glob のソート順序を定義できます。

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

そして、例えば次のように使用します。

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

または

sorted_file_list=(*(.no+byOrder))

(また、.glob修飾子に を追加して、通常ファイル(ディレクトリ、FIFO、シンボリックリンクなどではありません)。

関連情報