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

微子网络与大家分享了在Linux shell中使用sed批量更改文件名的方法。希望你看完这篇文章有所收获。大家一起讨论一下。

示例

去除特定字符

目标:把2017-01-01.jpg和2018-01-01.jpg变成20170101.jpg和20180101.jpg

方法:用空值替换全部

for filein ` ls | grep . jpg ` s

newfile=`echo$file|sed的/-//g ' `

mv$file$newfile

在此完成,sed用于替换标准输出的字符串,其一般格式如下:

Stdout|sed的/pattern/replace/'在上面的示例中,在末尾添加了G以替换所有匹配项,而不仅仅是第一个匹配项。

中间插入字符

目标:把book-01.txt和纸-02.txt改成book-01 . txt和纸-02.txt。

方法:利用组匹配获取待插入位置两侧的字符串,然后用反向引用替换

for filein ` ls | grep . txt ` s

newfile=`echo$file|sed的/\([a-z]\ \)\([0-9]\ \)/\1-\2/' '

mv$file$newfile

完成分析

在上面的例子中,要重命名的文件列表是通过ls和grep命令获得的,然后用sed命令替换字符串,最后用mv命令更改文件名。

有很多方法可以得到要重命名的文件列表,比如find命令或者直接字符串,后面会提到。

注意ls | grep。for循环后的txt。该命令包含在两个反单引号中,其功能与$(ls | grep)相同。txt)。封闭的字符串将作为命令执行,然后返回字符串结果。

文件名包含空格的解决方法

我们可以将文件列表直接写入for循环,而不是通过命令获取,例如:

对于文件“文件1文件2文件3”

.

Done可以看到for循环按空格拆分字符串,所以如果要更改的文件名包含空格,就会被拆分成多个文件名,导致错误。

为了解决这个问题,我们可以将IFS(内部字段分隔符)设置为一个新的行字符\n,这样for循环就会逐行获取变量的值,保证每次都得到一个完整的文件名。

设置IFS变量的命令需要放在for循环之前:

IFS=$'\n '

forfilein`ls

.

完成也可以直接使用while read命令一次读取一行到变量文件中:

ls|grep'*。txt“| while readfile”

.

完成使用 find 获取文件列表

在前面的例子中,我们使用ls命令来获取文件列表。这个命令只能获取某个目录的文件,不能按多个条件过滤。

说到文件搜索,不得不提功能强大的find命令。该命令可以在多级目录中查找文件,并可以设置创建时间、文件大小、所有者等各种条件。查找文件特别方便灵活。

使用find命令获取文件列表,然后使用sed命令用正则表达式修改文件名。这两个命令的组合可以完成几乎所有常见的批量重命名任务。

例如,所有大于1M且后缀为txt或jpg的文件都从book_20170101.txt和image_20170101.jpg格式的文件重命名为20170101-book.txt和20170101-image.jpg,代码如下:

forfilein`find。-大小1M-名称' *_*。txt'-o-name'*_*。jpg ' ` s

newfile=`echo$file|sed的/\([a-z]\ \)_\([0-9]\ \)。/\2-\1./'`

mv$file$newfile

读完这篇文章,done相信你已经对Linux shell中使用sed批量更改文件名的方法有了一定的了解。如果您想了解更多相关知识,请关注微子网络,感谢您的阅读!

你可能感兴趣的:(linux,sed名宁)