Linux shell利用sed批量更改文件名的方法

  介绍

小编给大家分享一下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批量更改文件名的方法