当前位置:  开发笔记 > 编程语言 > 正文

使用Bash批量重命名文件

如何解决《使用Bash批量重命名文件》经验,为你挑选了3个好方法。

Bash如何重命名一系列包以删除其版本号?我一直在玩弄周围既expr%%,都无济于事.

例子:

Xft2-2.1.13.pkgXft2.pkg

jasper-1.900.1.pkgjasper.pkg

xorg-libXrandr-1.2.3.pkgxorg-libXrandr.pkg



1> richq..:

您可以使用bash的参数扩展功能

for i in ./*.pkg ; do mv "$i" "${i/-[0-9.]*.pkg/.pkg}" ; done

带空格的文件名需要引号.


到目前为止,我最喜欢这个!
对于一次性的单线交互式东西,我总是使用它而不是sed-fu.如果它是一个脚本,那么,请避免使用bashisms.
不是bash解决方案,但如果你安装了perl,它为批量重命名提供了方便的重命名命令,只需"重命名"s/ - [0-9.]*//"*.pkg`

2> Diomidis Spi..:

如果所有文件都在同一目录中的顺序

ls | 
sed -n 's/\(.*\)\(-[0-9.]*\.pkg\)/mv "\1\2" "\1.pkg"/p' | 
sh

会做你的工作.的sed的命令将创建的序列MV命令,这些命令可以然后管进入外壳.最好先运行没有尾随的管道| sh,以验证命令是否符合要求.

要通过多个目录进行递归,请使用类似的东西

find . -type f |
sed -n 's/\(.*\)\(-[0-9.]*\.pkg\)/mv "\1\2" "\1.pkg"/p' |
sh

注意,在sed的正则表达式分组序列是通过一个反斜杠支架, \(\),而不是单一的括号().


在sed中,正则表达式分组序列是\(而不是单个括号.

3> Diego Sevill..:

我会做这样的事情:

for file in *.pkg ; do
    mv $file $(echo $file | rev | cut -f2- -d- | rev).pkg
done

假设您的所有文件都在当前目录中.如果没有,请尝试使用Javier上面提到的find.

编辑:此外,此版本不使用任何特定于bash的功能,如上面的其他功能,这将导致您更具可移植性.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有