我有几个这样的文件(在 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
您可以使用find
的exec
选项(递归地)循环遍历所有文件,然后使用简单的字符串替换:
find . -type f -name "product-103*" \
-exec sh -c 'echo mv "$0" "${0/103/104}"' '{}' \;
echo
当您确定此操作符合您的要求时,请将其删除。
基本上,它exec
的作用是替换在 中找到的每个文件的文件名{}
,并将其作为参数传递给sh -c
。此参数可用作$0
,因此是文件名。我们$0
在mv
调用中使用此参数,其中第二个参数是新文件名。这里,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