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

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

最近为了练习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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: