在文件中查找模式并重命名

时间:2013-03-08 09:01:17

标签: linux bash

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

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 个答案:

答案 0 :(得分:80)

你正在回应你的'mv'命令,而不是实际执行它。改为:

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

答案 1 :(得分:35)

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

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

rename 's/GHBAG/stream-agg/' *-GHBAG-*

答案 2 :(得分:17)

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

rename 's/GHBAG/stream-agg/' **/*-GHBAG-*

答案 3 :(得分:1)

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

# 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
相关问题