小编给大家分享一下Linux shell利用sed批量更改文件名的方法,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!
<强>示例强>
<强>去除特定字符强>
目标:将2017 - 01 - 01. jpg, 2018 - 01 - 01. jpg改jpg为20170101.,20180101. jpg
方法:将所有——替换为空
for file 拷贝“| ls ; grep  . jpg” 做 ,newfile中=' | echo file 美元;sed & # 39; s/?/舌鳎# 39;” mv file newfile中美元 做
这里使用sed进行标准输出的字符串替换,其通用格式如下:
stdout |, sed & # 39; s/模式/替换/& # 39;
上述示例中,在末尾添加g用于替换所有匹配的项,而不仅仅替换第一个匹配项。
<强>中间插入字符强>
目标:将book01.txt, paper02。txt改为书- 01. - txt, paper-02。txt
方法:用分组匹配分别获取待插入位置两侧的字符串,再通过反向引用实现替换
for file 拷贝“| ls ; grep  . txt” 做 ,newfile中=' | echo file 美元;sed & # 39; s/\ [a - z] \ + \ \ ([0 - 9] + \ \)/1 - \ \ 2/& # 39;” mv file newfile中美元 以前做><>强分析强>
上述示例首先通过ls和grep命令得到待改名的文件列表,然后用sed命令进行字符串的替换,最后再使用mv命令来完成文件名的更改。
获取待改名文件列表的方法有很多,可以通过找到命令,也可以直接给出字符串,我们将在下文中提到。
注意为循环后面的<代码> ls | grep . txt> 代码,这条命令用两个反单引号括了起来,与<代码>美元(ls | grep . txt) 代码>的作用相同,被包围的字符串会被当作命令执行,然后返回字符串结果。
<强>文件名包含空格的解决方法强>
我们可以直接将文件列表写的到循环中,而不是通过命令来得到,例如:
for file “拷贝file1 file2 file3" 做 ,……可完成以看到的循环是通过空格来分割字符串,因此如果待更改的文件名中包含空格的话,就会被拆分成多个文件名,从而出的错。
要解决这个问题,我们可以将IFS(内部字段分隔符)设置为换行符\ n,这样一来,为循环就会按行来获取变量的值,确保每次获取的确实是一个完整的文件名。
设置IFS变量的命令需要放的在循环之前:
IFS=$ & # 39; \ n # 39; for file “ls”拷贝 做 ,……完成也可以直接使用而读命令一次读取一行到变量文件中:
ls |, grep “* .txt", | while read 文件 做 ,…… 以前做><>强使用找到获取文件列表强>
之前的示例中,我们是通过ls命令来获取文件列表。该命令只能获取某个目录的文件,而且没法进行多种条件的筛选。
而一说到文件的查找,不得不提到功能强大的发现命令。该命令可以在多个层次的目录中查找文件,并能够设定诸如创建时间,文件大小,所有者等多种条件,查找起文件来特别方便灵活。
用找到命令来获取文件列表,再用sed命令配合正则表达式来修改文件名,这两个命令的结合几乎能完成所有常见的批量改名任务。
例如,将所有大于1 m,且后缀为txt或jpg格式的文件,由形如book_20170101.txt, image_20170101.jpg的文件改名为20170101 - book.txt 20170101 - image.jpg代码如下:
for file 拷贝的find 只-size + 1 m -name “* _ * .txt", -o -name “* _ * .jpg"” 做 ,newfile中=' | echo file 美元;sed & # 39; s/\ [a - z] \ + \) _ \ ([0 - 9] \ + \)/2 - 1. \ \ & # 39;” mv file newfile中美元 做Linux shell利用sed批量更改文件名的方法