Bash:列出按其包含的数字排序的文件

时间:2016-01-17 21:41:19

标签: bash sorting filenames ls

目标

我有一系列具有各种名称的文件。每个文件的名称都包含一个由1到4位数字组成的唯一整数。我想订购文件(通过显示他们的全名),但按照他们包含的号码排序。

示例

文件..

var_dump(
    defined('\A\B::X') &&
    array_key_exists('Y', \A\B::X) &&
    array_key_exists('Z', \A\B::X['Y'])
);

..应列为

Hello54.txt
piou2piou.txt
hap_1002_py.txt
JustAFile_78.txt
darwin2012.txt

1 个答案:

答案 0 :(得分:2)

您只需按数字部分排序即可。一种方法可能是消除非数字部分并构建数组。从好的方面来说,bash有稀疏数组,所以无论你添加成员的顺序如何,它们都会以正确的顺序出现。伪代码:

array[name_with_non_numerics_stripped]=name
print array

我快速而不小心的实施:

sortnum() {
    # Store the output in a sparse array to get implicit sorting
    local -a map
    local key
    # (REPLY is the default name `read` reads into.)
    local REPLY 
    while read -r; do
        # Substitution parameter expansion to nuke non-numeric chars
        key="${REPLY//[^0-9]}"
        # If key occurs more than once, you will lose a member.
        map[key]="$REPLY"
    done
    # Split output by newlines.
    local IFS=$'\n'
    echo "${map[*]}"
}

如果你有两个成员具有相同的"数字"值,只打印最后一个。 @BenjaminW建议将这些条目与换行符一起附加。有点像...

[[ ${map[key]} ]] && map[key]+=$'\n'
map[key]+="$REPLY"

...取代上面的map[key]="$REPLY"