Ответ 1
Вы выполняете эхо-команду "mv", а не выполняете ее. Изменить на:
find . -name '*-GHBAG-*' -exec bash -c 'mv $0 ${0/GHBAG/stream-agg}' {} \;
Я использую эту команду для поиска файлов с заданным шаблоном, а затем переименовываю их в нечто другое
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
, я вижу старые имена файлов.
Вы выполняете эхо-команду "mv", а не выполняете ее. Изменить на:
find . -name '*-GHBAG-*' -exec bash -c 'mv $0 ${0/GHBAG/stream-agg}' {} \;
Я бы предложил использовать команду rename
для выполнения этой задачи. rename
переименовывает имена файлов, предоставленные в соответствии с правилом, заданным как регулярное выражение Perl.
В этом случае вы можете использовать:
rename 's/GHBAG/stream-agg/' *-GHBAG-*
В ответ на комментарий anumi вы можете искать рекурсивно вниз по каталогам, сопоставляя "**":
rename 's/GHBAG/stream-agg/' **/*-GHBAG-*
Это работает для моих нужд, заменяя все подходящие файлы или типы файлов. Будьте осторожны, это очень жадный поиск
# 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