技术问询:提取最高数字文件扩展名并保存至变量
嘿,这两个shell脚本需求都挺实用的,我给你整理了靠谱的实现方案,附详细解释:
需求1:将文件的最顶层扩展名保存至变量
这里我默认你说的“最高文件扩展名”是指文件的最后一个扩展名(比如archive.tar.gz的扩展名是gz),如果是单扩展名文件(比如note.txt)就直接提取后缀部分。
方案一:提取单个文件的最后一个扩展名
# 先定义文件名变量,比如你的文件是report.pdf或者archive.tar.gz filename="archive.tar.gz" # 用shell参数扩展提取最后一个扩展名 ext="${filename##*.}" # 打印验证结果 echo "提取到的扩展名:$ext" # 这里会输出gz
解释:${filename##*.}是shell的参数扩展语法,##表示从字符串开头删除最长的匹配模式*.,也就是删掉最后一个点之前的所有内容,剩下的就是最后一个扩展名。
方案二:获取当前目录下排序最高的扩展名(按字母顺序)
如果你的需求是找当前目录里所有文件中,按字母排序“最高”的扩展名(比如zsh比txt排序靠后,算“最高”),可以用这行:
highest_ext=$(ls -1 | grep -E '\.' | sed 's/.*\.//' | sort | tail -n1) echo "目录中最高排序的扩展名:$highest_ext"
需求2:找出数字扩展名备份文件中的最大数字并保存至变量
针对backup.1、backup.2、backup.3这类以数字为扩展名的文件,要把最大的数字存到变量i里,有两种写法:
简洁写法(适合文件名无特殊字符的场景)
# 提取所有backup.*的数字部分,按数字排序后取最后一个 i=$(ls backup.* | sed 's/backup\.//' | sort -n | tail -n1) echo "最大的数字扩展名:$i" # 示例中会输出3
解释:
ls backup.*列出所有以backup.开头的文件sed 's/backup\.//'去掉前缀backup.,只留下数字部分sort -n按数字大小排序(一定要加-n,不然字典排序会让10排在2前面)tail -n1取排序后的最后一行,也就是最大的数字
健壮写法(支持文件名含空格等特殊字符)
如果怕目录里有特殊文件名(比如带空格的),或者有非数字扩展名的backup文件(比如backup.txt),用循环判断更稳妥:
# 初始化变量i为0 i=0 # 遍历所有backup.*文件 for file in backup.*; do # 提取文件名中backup.后面的部分 num="${file##backup.}" # 检查是否为纯数字,且比当前i大,就更新i if [[ "$num" =~ ^[0-9]+$ && "$num" -gt "$i" ]]; then i="$num" fi done echo "最大的数字扩展名:$i"
这个写法会自动跳过非数字扩展名的backup文件,也能处理各种特殊文件名,稳定性更强。
内容的提问来源于stack exchange,提问作者Lukashoi
相关产品推荐
相关产品推荐

