如何确定 files/folders 是否具有升序编号模式?

How determine if files/folders have a ascending order numbering pattern?

我正在尝试确定目录中存在的所有 files/folders 是否在其名称中的同一位置具有升序编号模式

如果数字在每种情况下都始终出现在固定位置,这将非常容易

ls $HOME/dir

1. Some String
2. Some String- Part 4
3. Some String- Part 5

在这里我只是简单地使用类似 ls $HOME/dir | sort -V | grep -Eo '^[0-9]'

该命令将输出 1 2 3 并且 files/folders 具有升序编号模式是一个简单的结论

现在这里有 2 个问题:

  1. 这些数字不一定像上面那样总是在开头
  2. 中间有时会有随机数

==========================================

ls $HOME/dir

Lecture 1 - Some String
Lecture 2 - Some String - Part 4
Lecture 3 - Some String - Part 5

预期输出 - 1 2 3

我主要的事情是,我需要 grep 只输出数字,如果它们以升序出现 在文件名中的相同位置 整个

==========================================

ls $HOME/dir

1. Some String
Some String - Part 2
Some String - Part 3

对于这样的东西,grep 根本不应该输出任何东西,因为即使它的名称中有递增的数字,它们也不会始终出现在同一个地方

==========================================

PS / 我所有示例中的 'Some String' 部分对于每个 file/folders 都是不同的。仅考虑升序数字的位置不变(如果有)

再举一个例子

ls $HOME/dir

CB) Lecture 1 xyz
CB) Lecture 2 abc-part 8
CB) Lecture 3 pqr-part 9

预期输出 - 1 2 3

这是一个使用 AWK 的解决方案:

printnumbers.awk

BEGIN {
    numberRegex = "[0-9]+([^A-Za-z0-9]|$)"
}

NR == 1 {
    numberPos = match([=10=], numberRegex)
}

match([=10=], numberRegex) == numberPos {
    matchedString = substr([=10=], RSTART, RLENGTH)
    match(matchedString, "[0-9]+")
    result = result substr(matchedString, RSTART, RLENGTH) "\n"
    next
}

{
    result = ""
    exit 1
}

END {
    printf("%s", result)
}

然后运行

$ ls $HOME/dir | sort -V | awk -f printnumbers.awk

编辑 2021-05-14

第二种方法是将每一行拆分为以非数字作为分隔符的字段。那么每个字段要么是一个数字,要么是一个空字符串。对于每一行,我们检查字段以查看是否形成了从一个开始的连续数字序列。

逻辑如下:

BEGIN {
    FS = "[^0-9]+"
}

{
    for (i = 1; i <= NF; i++) {
        numbersConsecutive[i] = ($i == NR) && ((NR == 1) || numbersConsecutive[i])
    }
    if (NF > numbersConsecutiveLen) {
        numbersConsecutiveLen = NF
    }
}

END {
    consecutiveNumbersFound = 0
    for (i = 1; i <= numbersConsecutiveLen; i++) {
        if (numbersConsecutive[i]) {
            consecutiveNumbersFound = 1
        }
    }
    if (consecutiveNumbersFound) {
        for (i = 1; i <= NR; i++) {
            print i
        }
    }
}