在文件名列表中查找和替换字符串

jos*_*erk 2 mac unix command-line macos

我有几个这样的文件(在 Mac OS X 上):

product-103-footer.tpl
product-103-header.tpl
product-103.tpl
Run Code Online (Sandbox Code Playgroud)

我想使用 grep 和 sed 或类似的东西将所有文件名中的“103”替换为其他内容。

我该怎么做?

这是我想要实现的一些伪命令行

find . /[103] | grep 103 | sed s/103/104/
Run Code Online (Sandbox Code Playgroud)

希望这是有道理的!

编辑:

越来越近:

find . -name 'product-103*' -print | sed 's/103/104/g'
Run Code Online (Sandbox Code Playgroud)

slh*_*hck 9

您可以使用find'sexec选项(递归地)遍历所有文件,然后使用简单的字符串替换:

find . -type f -name "product-103*" \
-exec sh -c 'echo mv "$0" "${0/103/104}"' '{}' \;
Run Code Online (Sandbox Code Playgroud)

echo当您确定这符合您的要求时,请删除它。

基本上,什么exec是替换在 中找到的每个文件的文件名{},它作为参数传递给sh -c. 此参数可用作$0,因此是文件名。我们$0mv调用中使用此参数,其中第二个参数是新文件名。此处,103 替换为 104。请注意,需要双引号才能正确处理文件名中的空格。

请参阅Bash 脚本指南中的字符串操作


使用 zsh zmv(在 OS X 上/bin/zsh):

autoload -U zmv
zmv -Wn '*103*' '*104*'
Run Code Online (Sandbox Code Playgroud)

-n当这满足您的需要时,请删除该选项。