如何用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
相关产品推荐
相关产品推荐

