Linux shell利用sed如何批量更改文件名详解

发布时间 - 2026-01-11 03:19:14    点击率:

前言

本文主要给大家介绍了关于Linux shell用sed批量更改文件名的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

示例

去除特定字符

目标:将 2017-01-01.jpg、2018-01-01.jpg 改为 20170101.jpg、20180101.jpg

方法:将所有 - 替换为空

for file in `ls | grep .jpg`
do
 newfile=`echo $file | sed 's/-//g'`
 mv $file $newfile
done

这里使用sed进行标准输出的字符串替换,其通用格式如下:

stdout | sed 's/pattern/replace/'

上述示例中,在末尾添加g用于替换所有匹配项,而不仅仅替换第一个匹配项。

中间插入字符

目标:将 book01.txt、paper02.txt 改为 book-01.txt、paper-02.txt

方法:用分组匹配分别获取待插入位置两侧的字符串,再通过反向引用实现替换

for file in `ls | grep .txt`
do
 newfile=`echo $file | sed 's/\([a-z]\+\)\([0-9]\+\)/\1-\2/'`
 mv $file $newfile
done

分析

上述示例首先通过 ls 和 grep 命令得到待改名的文件列表,然后用 sed 命令进行字符串的替换,最后再使用 mv 命令来完成文件名的更改。

获取待改名文件列表的方法有很多,可以通过 find 命令,也可以直接给出字符串,我们将在下文中提到。

注意 for 循环后面的 ls | grep .txt,这条命令用两个反单引号括了起来,与 $(ls | grep .txt) 的作用相同,被包围的字符串会被当作命令执行,然后返回字符串结果。

文件名包含空格的解决方法

我们可以直接将文件列表写到 for 循环中,而不是通过命令来得到,例如:

for file in "file1 file2 file3"
do
 ...
done

可以看到 for 循环是通过空格来分割字符串,因此如果待更改的文件名中包含空格的话,就会被拆分成多个文件名,从而出错。

要解决这个问题,我们可以将 IFS(内部字段分隔符)设置为换行符 \n,这样一来,for 循环就会按行来获取变量的值,确保每次获取的确实是一个完整的文件名。

设置 IFS 变量的命令需要放在 for 循环之前:

IFS=$'\n'
for file in `ls`
do
 ...
done

也可以直接使用 while read 命令一次读取一行到变量 file 中:

ls | grep "*.txt" | while read file
do
 ...
done

使用 find 获取文件列表

之前的示例中,我们是通过 ls 命令来获取文件列表。该命令只能获取某个目录的文件,而且没法进行多种条件的筛选。

而一说到文件的查找,不得不提到功能强大的 find 命令。该命令可以在多个层次的目录中查找文件,并能够设定诸如创建时间、文件大小、所有者等多种条件,查找起文件来特别方便灵活。

用 find 命令来获取文件列表,再用 sed 命令配合正则表达式来修改文件名,这两个命令的结合几乎能完成所有常见的批量改名任务。

例如,将所有大于1M,且后缀为txt或jpg的文件,由形如 book_20170101.txt、image_20170101.jpg 的文件改名为 20170101-book.txt、20170101-image.jpg,代码如下:

for file in `find . -size +1M -name "*_*.txt" -o -name "*_*.jpg"`
do
 newfile=`echo $file | sed 's/\([a-z]\+\)_\([0-9]\+\)./\2-\1./'`
 mv $file $newfile
done

有关 find 命令的更多用法,可以参考 https://www./article/108198.htm

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# linux  # shell  # sed  # 替换  # 批量更改文件名  # Shell命令批量修改图片文件名  # Linux shell中改文件名的方法总结  # 文件列表  # 就会  # 多个  # 我们可以  # 可以直接  # 是一个  # 放在  # 相关内容  # 第一个  # 有很多  # 说了  # 不多  # 说到  # 而不  # 这两个  # 这条  # 可以通过  # 给大家  # 可以看到  # 写到 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  音乐网站服务器如何优化API响应速度?  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  百度浏览器如何管理插件 百度浏览器插件管理方法  制作旅游网站html,怎样注册旅游网站?  郑州企业网站制作公司,郑州招聘网站有哪些?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel如何实现事件和监听器?(Event & Listener实战)  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  Laravel如何优化应用性能?(缓存和优化命令)  北京专业网站制作设计师招聘,北京白云观官方网站?  如何快速搭建高效WAP手机网站吸引移动用户?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel如何使用Service Container和依赖注入?(代码示例)  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Laravel如何生成URL和重定向?(路由助手函数)  如何在阿里云虚拟服务器快速搭建网站?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  IOS倒计时设置UIButton标题title的抖动问题  如何利用DOS批处理实现定时关机操作详解  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  高性价比服务器租赁——企业级配置与24小时运维服务  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  如何自定义建站之星模板颜色并下载新样式?  使用C语言编写圣诞表白程序  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  微信小程序 五星评分(包括半颗星评分)实例代码  C++用Dijkstra(迪杰斯特拉)算法求最短路径  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  详解CentOS6.5 安装 MySQL5.1.71的方法  如何快速搭建高效可靠的建站解决方案?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  高端建站如何打造兼具美学与转化的品牌官网?  如何挑选高效建站主机与优质域名?