我使用此命令查找具有给定模式的文件,然后将其重命名为其他内容
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
时,我会看到旧的文件名。
答案 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