You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用grep/find提取文件名前缀并保留后缀?

Bash处理文件名:提取前缀并转换数字为二进制

先纠正一个误解

cut命令不是只能处理文本文件,它完全可以处理管道输入或者变量中的字符串内容,不用局限于文件。

提取文件名前缀的几种方法

假设你的文件名格式是前缀-三位数字.grf(比如023-124.grf),以下是几种提取前缀的方式:

1. Bash内置参数展开(推荐,无需外部命令)

这是最高效的方式,直接用Bash的字符串处理能力:

file="023-124.grf"
# 提取不带横杠的前缀(比如023)
prefix_core="${file%-*}"
# 提取带横杠的前缀(比如023-)
prefix="${file%-*}-"

解释:${var%-*}的作用是去掉变量var中最后一个-及其后面的所有内容。

2. 用grep提取前缀

如果一定要用grep,可以这样写:

file="023-124.grf"
# 提取带横杠的前缀
prefix=$(echo "$file" | grep -oE '.*-')

解释:grep -oE表示只输出匹配的部分,.*-会匹配到最后一个-为止的所有字符。

3. 用cut提取前缀

你之前尝试的cut完全可以用,示例:

file="023-124.grf"
# 提取带横杠的前缀
prefix=$(echo "$file" | cut -d'-' -f1)-

解释:cut -d'-' -f1会以-为分隔符,取第一部分(即023),手动加上-就得到完整前缀。

十进制转二进制并生成新文件名

提取出前缀和需要处理的三位数字后,用bc命令完成进制转换,再组合成新文件名:

file="023-124.grf"
# 提取前缀
prefix="${file%-*}-"
# 提取三位数字(用参数展开更简洁)
num="${file%.grf}"
num="${num##*-}"

# 十进制转二进制
binary=$(echo "obase=2; $num" | bc)
# 如果需要固定位数(比如补零到8位),用printf:
# binary=$(printf "%08d" $(echo "obase=2; $num" | bc))

# 生成新文件名
new_file="${prefix}${binary}.grf"
# 输出结果:023-1111100.grf
echo "$new_file"

批量处理文件(配合find)

如果要批量处理目录下所有符合格式的文件,可以用find循环:

find . -name "*-[0-9][0-9][0-9].grf" -type f | while read -r file; do
    prefix="${file%-*}-"
    num="${file%.grf}"
    num="${num##*-}"
    binary=$(echo "obase=2; $num" | bc)
    # 可选:补零到8位
    # binary=$(printf "%08d" "$binary")
    new_file="${prefix}${binary}.grf"
    # 重命名文件,如需测试可以先echo代替mv
    mv "$file" "$new_file"
done

内容的提问来源于stack exchange,提问作者idk Something

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:15:26