我需要在 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