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
发布于 2009-03-02 15:33:47
您可以使用bash的参数扩展功能
for i in ./*.pkg ; do mv "$i" "${i/-[0-9.]*.pkg/.pkg}" ; done
带空格的文件名需要使用引号。
发布于 2018-03-05 03:41:55
这是一个几乎等同于currently accepted answer的POSIX。这用Bash-only ${variable/substring/replacement}
参数扩展换成了在任何与Bourne兼容的shell中都可用的参数扩展。
for i in ./*.pkg; do
mv "$i" "${i%-[0-9.]*.pkg}.pkg"
done
参数expansion ${variable%pattern}
生成variable
的值,该值带有与删除的pattern
匹配的任何后缀。(也有用于删除前缀的${variable#pattern}
。)
我从可接受的答案中删除子模式-[0-9.]*
,尽管它可能具有误导性。它不是一个正则表达式,而是一个全局模式;所以它不意味着“后面跟着零个或多个数字或点的破折号”。相反,它的意思是“一个破折号,后面跟着一个数字或一个点,后面跟着任何东西”。"anything“将是最短的匹配,而不是最长的。(Bash提供了##
和%%
来修剪可能最长的前缀或后缀,而不是最短的。)
发布于 2018-08-22 17:05:26
我发现对于这类事情,rename是一种更简单的工具。我在OSX的Homebrew上找到的
对于您的示例,我会这样做:
rename 's/\d*?\.\d*?\.\d*?//' *.pkg
“%s”表示替换。表单是s/searchPattern/replacement/ files_to_apply。为此,您需要使用正则表达式,这需要一些研究,但这是值得的。
https://stackoverflow.com/questions/602706
复制相似问题