列出根據特定內容行排序的文件

列出根據特定內容行排序的文件

我有一個檔案目錄。每個文件中都有一行內容:

# 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 限定符新增 a以僅考慮常規的檔案(不是目錄、fifo、符號連結...))。

相關內容