60

我使用此命令查找具有给定模式的文件,然后将它们重命名为其他名称

find . -name '*-GHBAG-*' -exec bash -c 'echo mv $0 ${0/GHBAG/stream-agg}' {} \;

当我运行这个命令时,我看到一些像这样的输出

mv ./report-GHBAG-1B ./report-stream-agg-1B
mv ./reoprt-GHBAG-0.5B ./report-stream-agg-0.5B

但是最后,当我运行时ls,我看到了旧文件名。

4

4 回答 4

90

您正在回显您的“mv”命令,而不是实际执行它。改成:

find . -name '*-GHBAG-*' -exec bash -c 'mv $0 ${0/GHBAG/stream-agg}' {} \;
于 2013-03-08T09:02:25.120 回答
37

我建议使用该rename命令来执行此任务。rename根据指定为 Perl 正则表达式的规则重命名提供的文件名。

在这种情况下,您可以使用:

rename 's/GHBAG/stream-agg/' *-GHBAG-*
于 2013-03-08T09:06:12.280 回答
20

在回复 anumi 的评论时,您实际上可以通过匹配 '**' 递归地向下搜索目录:

rename 's/GHBAG/stream-agg/' **/*-GHBAG-*
于 2013-08-20T03:46:36.710 回答
2

这适用于我的需要,替换所有匹配的文件或文件类型。请注意,这是一个非常贪婪的搜索

# bashrc
function file_replace() {
  for file in $(find . -type f -name "$1*"); do
    mv $file $(echo "$file" | sed "s/$1/$2/");
  done
}

我通常会find . -type f -name "MYSTRING*"在更换之前提前检查比赛。

例如:

file_replace "Slider.js" "RangeSlider.ts"

renamed:    packages/react-ui-core/src/Form/Slider.js -> packages/react-ui-core/src/Form/RangeSlider.ts
renamed:    stories/examples/Slider.js -> stories/examples/RangeSlider.ts

或放弃文件类型以使其更加贪婪

file_replace Slider RangeSlider

renamed:    packages/react-ui-core/src/Form/Slider.js -> packages/react-ui-core/src/Form/RangeSlider.js
renamed:    stories/examples/Slider.js -> stories/examples/RangeSlider.js
renamed:    stories/theme/Slider.css -> stories/theme/RangeSlider.css
于 2017-07-06T01:37:14.167 回答