如何在 Linux 中使用正则表达式捕获组重命名文件?
How to rename a file using regex capture group in Linux?
我想将 a_1.0.tgz
重命名为 b_1.0.tgz
,因为 1.0
可以更改为任何版本号,我该如何实现?
比如我不需要保留版本号可以用mv a*.tgz b.tgz
我对 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
。
假设您想用字母 b
替换所有匹配 a*.tgz
的文件中的第一个字符:
for f in a*.tgz; do
echo mv "$f" "b${f:1}"
done
当您确定这符合您的要求时,请删除 echo
。
${f:1}
使用${name:offset}
参数扩展。来自 zshexpn
手册(在 OS X 上):
If offset is non-negative, then if the variable name is a
scalar substitute the contents starting offset characters
from the first character of the string, [...]
zsh 附带实用程序 zmv
,它正是为此而设计的。虽然 zmv
不支持正则表达式,但它确实为文件名生成模式(又名 globbing)提供了捕获组。
首先,您可能需要启用 zmv
。这可以通过将以下内容添加到您的 ~/.zshrc
:
来完成
autoload -Uz zmv
然后你可以像这样使用它:
zmv 'a_(*)' 'b_'
这将重命名任何匹配 a_*
的文件,因此 a_
被 b_
替换。如果想不那么笼统,当然可以调整花样:
仅重命名 .tgz
个文件:
zmv 'a_(*.tgz)' 'b_'
仅重命名 .tgz
个文件,同时将扩展名更改为 .tar.gz
zmv 'a_(*).tgz' 'b_.tar.gz'
仅重命名 a_1.0.tgz
:
zmv 'a_(1.0.tgz)' 'b_'
为了节省开支,您可以先 运行 zmv
并选择 -n
。这只会打印,会发生什么,但实际上不会改变任何东西。有关更多信息,请查看 man zshcontrib
.
我想将 a_1.0.tgz
重命名为 b_1.0.tgz
,因为 1.0
可以更改为任何版本号,我该如何实现?
比如我不需要保留版本号可以用mv a*.tgz b.tgz
我对 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
。
假设您想用字母 b
替换所有匹配 a*.tgz
的文件中的第一个字符:
for f in a*.tgz; do
echo mv "$f" "b${f:1}"
done
当您确定这符合您的要求时,请删除 echo
。
${f:1}
使用${name:offset}
参数扩展。来自 zshexpn
手册(在 OS X 上):
If offset is non-negative, then if the variable name is a scalar substitute the contents starting offset characters from the first character of the string, [...]
zsh 附带实用程序 zmv
,它正是为此而设计的。虽然 zmv
不支持正则表达式,但它确实为文件名生成模式(又名 globbing)提供了捕获组。
首先,您可能需要启用 zmv
。这可以通过将以下内容添加到您的 ~/.zshrc
:
autoload -Uz zmv
然后你可以像这样使用它:
zmv 'a_(*)' 'b_'
这将重命名任何匹配 a_*
的文件,因此 a_
被 b_
替换。如果想不那么笼统,当然可以调整花样:
仅重命名
.tgz
个文件:zmv 'a_(*.tgz)' 'b_'
仅重命名
.tgz
个文件,同时将扩展名更改为.tar.gz
zmv 'a_(*).tgz' 'b_.tar.gz'
仅重命名
a_1.0.tgz
:zmv 'a_(1.0.tgz)' 'b_'
为了节省开支,您可以先 运行 zmv
并选择 -n
。这只会打印,会发生什么,但实际上不会改变任何东西。有关更多信息,请查看 man zshcontrib
.