Bash如何重命名一系列包以删除其版本号?我一直在玩弄周围既expr
和%%
,都无济于事.
例子:
Xft2-2.1.13.pkg
变 Xft2.pkg
jasper-1.900.1.pkg
变 jasper.pkg
xorg-libXrandr-1.2.3.pkg
变 xorg-libXrandr.pkg
您可以使用bash的参数扩展功能
for i in ./*.pkg ; do mv "$i" "${i/-[0-9.]*.pkg/.pkg}" ; done
带空格的文件名需要引号.
如果所有文件都在同一目录中的顺序
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的正则表达式分组序列是通过一个反斜杠支架, \(
和\)
,而不是单一的括号(
和)
.
我会做这样的事情:
for file in *.pkg ; do mv $file $(echo $file | rev | cut -f2- -d- | rev).pkg done
假设您的所有文件都在当前目录中.如果没有,请尝试使用Javier上面提到的find.
编辑:此外,此版本不使用任何特定于bash的功能,如上面的其他功能,这将导致您更具可移植性.