最近为了练习sed,我写了一个简单的脚本,用于批量修改文件名。所以下面这篇文章主要介绍Linux shell如何使用sed批量修改文件名的相关信息。有需要的朋友可以参考一下。让我们一起来看看吧。
前言
本文主要介绍Linux shell用sed批量更改文件名的相关内容,分享给大家参考。下面不多说了。我们来看看详细的介绍。
示例
去除特定字符
目标:将2017-01-01.jpg和2018-01-01.jpg改为20170101.jpg和20180101.jpg。
方法:将all-替换为empty。
对于` ls | grep .jpg '中的文件
做
new file=` echo $ file | sed ' s/-//g ' ` 1
mv $file $newfile
完成的
这里,sed用于标准输出的字符串替换,其一般格式如下:
stdout | sed 's/pattern/replace/'
在上面的例子中,在末尾加上G是用来替换所有的匹配,而不仅仅是第一个。
中间插入字符
目标:把book01.txt和paper-02.txt改成book01.txt和paper02.txt。
方法:通过分组匹配得到待插入位置两侧的字符串,然后通过反向引用进行替换。
对于` ls | grep .txt '中的文件
做
new file=` echo $ file | sed ' s/\([a-z]\ \)\([0-9]\ \)/\ 1-\ 2/' ` 1
mv $file $newfile
完成的
分析
在上面的例子中,通过ls和grep命令获得要重命名的文件列表,然后用sed命令替换字符串,最后用mv命令更改文件名。
有许多方法可以获得要重命名的文件列表。你可以使用find命令或者直接给出一个字符串,我们下面会提到。
注意ls | grep。for循环后的txt。这个命令用两个反单引号括起来,其功能与$(ls | grep相同。txt)。括起来的字符串将作为命令执行,然后返回字符串结果。
文件名包含空格的解决方法
我们可以直接将文件列表写入for循环,而不是通过命令获取,例如:
对于“文件1文件2文件3”中的文件
做
.
完成的
可以看出,for循环是以空格分割字符串的,所以如果要更改的文件名包含空格,就会被分割成多个文件名,从而导致错误。
为了解决这个问题,我们可以将IFS(内部字段分隔符)设置为newline \n,这样for循环就会逐行获取变量的值,保证每次都是完整的文件名。
设置IFS变量的命令需要放在for循环之前:
IFS=$'\n '
用于` ls '中的文件
做
.
完成的
您也可以直接使用while read命令将一行数据一次读入变量文件:
ls | grep '*。读取文件时
做
.
完成的
使用 find 获取文件列表
在前面的例子中,我们使用ls命令获取文件列表。这个命令只能获取某个目录的文件,不能按各种条件过滤。
说到查找文件,就不得不提到功能强大的find命令。该命令可以在多级目录中查找文件,并可以设置各种条件,如创建时间、文件大小、所有者等。查找文件特别方便灵活。
使用find命令获取文件列表,然后使用sed命令和正则表达式修改文件名。这两个命令的组合几乎可以完成所有常见的批量重命名任务。
例如,将所有大于1M的带有txt或jpg后缀book_20170101.txt和image_20170101.jpg的文件重命名为20170101-book.txt和20170101-image.jpg,代码如下:
用于“查找”中的文件。-尺寸1M-名称' *_*。txt' -o -name '*_*。jpg ' ` 1
做
new file=` echo $ file | sed ' s/\([a-z]\ \)_ \([0-9]\ \)。/\2-\1./'`
mv $file $newfile
完成的
有关查找命令的更多用法,请参考https://www.jb51.net/article/108198.htm.
总结
这就是本文的全部内容。希望这篇文章的内容能给你的学习或者工作带来一些帮助。有问题可以留言交流。谢谢你的支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。