我想将a_1.0.tgz
重命名为b_1.0.tgz
,因为1.0
可能会更改为任何版本号,我该如何实现?
例如,如果我不需要保留版本号,我可以使用mv a*.tgz b.tgz
。
答案 0 :(得分:3)
zsh 附带了实用程序zmv
,用于此目的。虽然zmv
不支持正则表达式,但它确实为文件名生成模式(又名 globbing )提供了捕获组。
首先,您可能需要启用zmv
。这可以通过将以下内容添加到~/.zshrc
:
autoload -Uz zmv
然后您可以像这样使用它:
zmv 'a_(*)' 'b_$1'
这会重命名与a_*
匹配的任何文件,因此a_
会被b_
取代。如果你想减少一般性,你当然可以调整模式:
仅重命名.tgz
个文件:
zmv 'a_(*.tgz)' 'b_$1'
在将扩展程序更改为.tgz
.tar.gz
个文件
zmv 'a_(*).tgz' 'b_$1.tar.gz'
仅重命名a_1.0.tgz
:
zmv 'a_(1.0.tgz)' 'b_$1'
要进行保存,您可以先使用zmv
选项运行-n
。这只会打印,会发生什么,但实际上并没有改变任何东西。有关更多信息,请查看man zshcontrib
。
答案 1 :(得分:0)
我对zsh
不太熟悉,所以我不知道它是否支持正则表达式,但我认为你真的不需要它们。
您可以使用glob匹配文件并使用替换:
for file in a_[0-9].[0-9].tgz; do
echo "$file" "${file/a/b}"
done
在glob模式中,[0-9]
匹配0
和9
之间的任意数字。 ${file/a/b}
将第一次a
替换为b
。
如果您对结果感到满意,请将echo
更改为mv
。
答案 2 :(得分:0)
假设您要将匹配a*.tgz
的所有文件中的第一个字符替换为字母b
:
for f in a*.tgz; do
echo mv "$f" "b${f:1}"
done
如果您确定这可以执行您想要的操作,请删除echo
。
${f:1}
使用${name:offset}
参数扩展。从zshexpn
手册(在OS X上):
如果offset是非负数,那么如果变量名是a 标量替换内容起始偏移字符 从字符串的第一个字符,[...]