如何使用 bash 对包含不一致数字后缀的文件名进行排序

如何使用 bash 对包含不一致数字后缀的文件名进行排序

我需要在 Linux 机器(centos 7)上创建一个 bash 脚本,以使用文件名开头的数字对一些文件进行排序,然后将其保存到列表变量中,以便我可以将完整文件名与运行脚本时提示用户输入的数字。

然而,这些文件的命名方式不一致。

文件名的第一部分是数字,第二部分是文本,但某些文件的扩展名为 . (句号/句号)分隔文件名的数字部分和文本部分,有些没有,有些有前导零,有些没有,例如:

001file.txt
2.file.txt
03file.txt
022.file.txt
28file.txt 

起初我想我可能需要使用正则表达式来对这些文件进行排序,但是有人向我指出这不起作用,因为文件名不规则,所以我想知道其中是否有内置函数bash 我最好使用...

任何建议或指示将不胜感激...

答案1

#!/bin/bash

# declare the arrays for the files and the sorting
declare -A files
declare -A sorting

# get a list of filenames into it, saving number without 0's as key
for file in *; do
    fnum=$(echo "$file" | tr -d -c 0-9 | sed 's/^0*//')
    files[$fnum]="$file"
    sorting[$fnum]=$fnum
done

# sort the array by its numeric key values
IFS=$'\n' sorted=($(sort -n <<<"${sorting[*]}"))
unset IFS

# check for user input and if its numerical
if [[ $1 =~ ^-?[0-9]+$ ]]; then
    # iterate through the array
    for i in "${sorted[@]}"; do
        # only handle files above user input number
        if [[ $i -gt $1 ]]; then
            # execute your sql here, echo is just for debugging
            echo ${files[$i]}
        fi
    done
else
    echo "Please supply a number as argument"
    exit 1
fi

该脚本将当前目录中的每个文件保存在一个关联数组中,使用文件中的数字作为每个项目的键,并使用相应的文件名作为其值。请注意,tr从文件名中提取所有数字,因此02.test.3.txt将变为23.前导零被忽略。


使用您的文件作为文件夹中的测试并运行脚本,因为./test.sh 2它输出以下内容:

03file.txt
022.file.txt
28file.txt

相关内容