【问题标题】:Bash: list files ordered by the number they containBash:列出按它们包含的数字排序的文件
【发布时间】:2016-01-17 21:41:18
【问题描述】:

目标

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

示例

文件..

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

.. 应列为

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

【问题讨论】:

  • 这里有什么特别令您难以接受的地方吗?

标签: bash sorting filenames ls


【解决方案1】:

您只需要按数字部分排序。一种方法可能是消除非数字部分并构建一个数组。从好的方面来说,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"

【讨论】:

  • 修复重复项:如果条目非空,将\n$REPLY 附加到现有条目?在最后一条语句中需要echo -e
  • @BenjaminW。我通常对在 bash 数组中引入另一个分隔符(使它们成为多维数组)持怀疑态度,但在这种情况下,我认为这“足够好”。
猜你喜欢
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多