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

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

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

product-103-footer.tpl
product-103-header.tpl
product-103.tpl

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

我该怎么做?

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

find . /[103] | grep 103 | sed s/103/104/

希望这是有意义的!

编辑:

越来越近:

find . -name 'product-103*' -print | sed 's/103/104/g'

答案1

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

find . -type f -name "product-103*" \
-exec sh -c 'echo mv "$0" "${0/103/104}"' '{}' \;

echo当您确定此操作符合您的要求时,请将其删除。

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

字符串操作在 Bash 脚本指南中。


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

autoload -U zmv
zmv -Wn '*103*' '*104*'

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

答案2

Perl 在这方面表现更佳。

find . -name 'product-103*' | perl -nle '($new=$_) =~ s/103/104/;rename $_,$new'

下面这段代码

perl -nle '($new=$_) =~ s/103/104/;rename $_,$new'

最终将扩展至

while (<>) {
    chomp;
    ($new=$_) =~ s/103/104/;
    rename $_, $new;
}

操作<>员将获取每个以 '\n' 结尾的文件名并将其保存到 $_,然后chomp将 '\n' 截掉。然后变量$new从中获取旧文件名$_并将 103 替换为 104。最后,rename只需将相关文件重命名为新名称。有关 -n -l -e 开关的更多详细信息,请参阅perl运行perldoc 的一部分。

答案3

for f in product-103*; do mv "$f" "${f/103/104}"; done

相关内容