如何使用cut命令或其他方法批量修改目录中带“-”的文件名
嘿,这个需求太常见了!处理带连字符(-)的文件名格式转换,cut是个入门利器,但根据你想要的最终格式,还有几个更灵活的方案,我给你一步步拆解:
用
cut命令精准截取字段 cut的核心是通过-d指定分隔符(这里就是-),再用-f指定要保留的字段位置,非常适合固定结构的文件名。
举几个实用例子:
- 如果你有文件名比如
data-20240615-report.csv,想去掉中间的日期部分,保留前后两段:echo "data-20240615-report.csv" | cut -d'-' -f1,3 # 输出:data-report.csv - 如果只想保留第一个
-之前的内容,比如把user-john-doe.jpg改成user.jpg:
这里要注意,echo "user-john-doe.jpg" | cut -d'-' -f1 # 输出:usercut会切掉后缀,所以实际重命名时最好先分离文件名和后缀:file="user-john-doe.jpg" prefix=$(echo "$file" | cut -d'-' -f1) suffix="${file##*.}" mv "$file" "${prefix}.${suffix}"
更灵活的场景:用
sed或awk处理复杂规则 如果你的文件名结构不固定,或者需要替换某段内容,sed和awk会更顺手:
sed正则替换:比如把第二个-之后的所有内容换成final,比如proj-v1-test.log→proj-v1-final.log:echo "proj-v1-test.log" | sed 's/-[^-]*\.log/-final.log/'awk字段拼接:比如把a-b-c-d.txt的第1、3、4段拼接成a-c-d.txt:echo "a-b-c-d.txt" | awk -F'-' '{print $1 "-" $3 "-" $4}'
批量重命名的实操技巧
如果要处理目录下所有符合规则的文件,用for循环结合上述命令最稳妥(测试阶段先把mv换成echo,避免误操作):
# 遍历所有带至少两个连字符的txt文件 for file in *-*-*.txt; do # 提取第1和第3段,保留后缀 new_name=$(echo "$file" | cut -d'-' -f1,3) # 打印要执行的重命名命令,确认无误后去掉echo echo mv "$file" "$new_name" done
如果你的系统装了Perl版本的rename(Debian/Ubuntu默认是这个),批量处理会更高效,比如把所有x-y-z.ext改成x-z.ext:
rename 's/(\w+)-\w+-(\w+)\.ext/$1-$2.ext/' *.ext
小提醒
- 所有涉及文件名的变量一定要用双引号包裹,避免文件名带空格时出错;
- 批量操作前务必先用
echo预览结果,确认没问题再执行mv; - 如果文件名有特殊字符(比如空格、括号),可以先给文件名转义,或者用
find命令配合xargs处理。
内容的提问来源于stack exchange,提问作者Santhosh Chakka
相关产品推荐
相关产品推荐

