<dd id="yzu3f"><tr id="yzu3f"><kbd id="yzu3f"></kbd></tr></dd>

              安基网 首页 系统 Linux 查看内容

              三招快速搞定 Linux 文件批量重命名!

              2019-2-26 15:23| 投稿: xiaotiger |来自: 互联网


              免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和?#35745;?#29256;权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

              摘要: 在我们的工作生活中,不管是程序员还是非程序员,都会遇到一个需求,那就是对一堆文件进行重命名。在 Windows 下有很多优秀的软件可以帮助我们完成这个需求,而在 Linux 环境下,我们可以简单敲一些代码就可以完成这 ...
              作者 | 良许

              责编 | 仲培艺

              在我们的工作生活中,不管是程序员还是非程序员,都会遇到一个需求,那就是对一堆文件进行重命名。在 Windows 下有很多优秀的软件可以帮助我们完成这个需求,而在 Linux 环境下,我们可以简单敲一些代码就可以完成这个需求。

              本文将介绍三种最基本的文件重命名方法,因为比较基础,所以老司机可以到此为止。

              rename 命令

              顾名思义,rename 命令就是用来进行重命名文件名的。rename 命令有非常强大的功能,我们可以用它来实现各种各样复杂的文件名修改。但是,本文只介绍它最最基本的功能。其最基本的格式如下:

              rename 源字符串 目标字符串 文件
              

              其中,源字符串表示原文件名需要替换的字符串,可以是原文件名的全部或部分;目标字符串就是想要替换成的字符串;文件就是需要更改文件名的文件列表,可以是一个或多个。

              现假如目录下有一堆 atb_mod_01.cpp、atb_mod_02.cpp、atb_mod_03.cpp、atb_mod_04.cpp 等?#38382;?#30340;文件,我们的需求是将文件名中的 mod 改成 adb,那么完成这个需求的命令如下:

              [[email protected]_0_16_centos exp3]$ ls
              atb_mod_01.cpp atb_mod_02.cpp atb_mod_03.cpp atb_mod_04.cpp
              [[email protected]_0_16_centos exp3]$ rename mod adb *
              [[email protected]_0_16_centos exp3]$ ls
              atb_adb_01.cpp atb_adb_02.cpp atb_adb_03.cpp atb_adb_04.cpp
              

              mv 命令配合 for 循环方式

              假如我们现在有一堆 .txt 文件,我们想将它们的后缀改成 .cpp。先来看完整的代码:

              #!/bin/bash
              for name in `ls *.txt`
              do
               mv $name ${name%.txt}.cpp
              done
              

              我们都知道,在 Linux 里重命名是用 mv 命令,那批量重命名自然会想到用循环语句嵌套 mv 命令。

              在这里,我们用 `ls *.txt` 将当前目录下所有的 txt 文件全部列出来,然后逐个放在 name 变量里去循环操作。

              在循环体里,我们使用 mv 命令进行重命名。这里我们使用 ${name%.txt} 这种字符串处理方式,表示从name尾部开始?#22659;?#19982; .txt 匹配的最小部分,并返回剩余部分。之后,再?#30001;?.cpp 后缀。通过这种操作,我们就可以将文件名后缀从 .txt 改为 .cpp。最后我们用 mv 命令将这个文件名真正改过来。

              sed 命令配合 for 循环方式

              假如我们现在有一堆文件,文件名格式是 test01.txt、test02.txt、test03.txt、test04.txt 也就是前半部分是英文,后半部分是数字。我们现在想将文件名改成 test-01.txt 这?#20013;问健?#36825;次,我们用 sed 命令来完成这个需求。

              我们还是先来看看完整的代码:

              #!/bin/bash
              for file in `ls *.txt`
              do
               newFile=`echo $file | sed s/\([a-z]\+\)\([0-9]\+\)/\1-\2/`
               mv $file $newFile
              done
              

              前面一样用 `ls \*.txt` 来获取所有的 .txt 文件。之后再用 echo 命令将其顺?#38382;?#20986;,作为 sed 命令的输入。

              接下来,到达关键部分了。乍一看 sed 的命令可能有点可怕,但老司机早已习以为常了。反引号里的内容其实是这样的基本结构:

              s/ 原字符串 / 替代的字符串 /
              

              这里我们用到了分组匹配,也就是用括号按照一定的正则表达式将原字符串进行分组,后面再用 \1,\2,\3…… 来引?#20204;?#38754;的分组,从而在替代的字符串里?#21019;?#25104;相应的格式。

              前文已讲述,原文件名是由?#23433;?#20998;英文及后部分数字所构成的,英文可以用 [a-z]+ 表示,数字可以用 [0-9]+ 表示。注意不要忘记加号,表示前面字符的若干重?#30784;?#28982;后,我们用 \1、\2 分别引?#20204;?#38754;的对应部分,再用横杆连起来,于是就成了这样::

              s/([a-z]+)([0-9]+)/\1-\2/
              

              因为在不同的 Shell 里,括号及加号可能会有不同的含义,所以前面要再加一个转义符,于是就成了前面所见到的样子。

              再之后,同样使用 mv 命令完成重命名动作。

              作者:良许,目前就职于一家世界500强外企,专注于Linux应用开发。本文首发于个人公众号「良许Linux」主要分享Linux方面干货,欢迎关注。

              声明:本文为作者投稿,版权归其个人所有。



              小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册账号,公开课频道价值万元IT培?#21040;?#31243;免费学,让您少走弯路、事半功倍,好工作升职?#26377;劍?/font>

              本文出自:https://www.toutiao.com/a6662190584448418311/

              免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和?#35745;?#29256;权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!


              鲜花

              ?#24080;?/a>

              雷人

              路过

              鸡蛋

              相关阅读

              最新评论

               最新
              返回顶部
              十一选五奖金对照表