微子网络与大家分享了在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批量更改文件名的方法有了一定的了解。如果您想了解更多相关知识,请关注微子网络,感谢您的阅读!