Подтвердить что ты не робот

Найти шаблон в файлах и переименовать их

Я использую эту команду для поиска файлов с заданным шаблоном, а затем переименовываю их в нечто другое

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, я вижу старые имена файлов.

4b9b3361

Ответ 1

Вы выполняете эхо-команду "mv", а не выполняете ее. Изменить на:

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

Ответ 2

Я бы предложил использовать команду rename для выполнения этой задачи. rename переименовывает имена файлов, предоставленные в соответствии с правилом, заданным как регулярное выражение Perl.

В этом случае вы можете использовать:

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

Ответ 3

В ответ на комментарий anumi вы можете искать рекурсивно вниз по каталогам, сопоставляя "**":

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

Ответ 4

Это работает для моих нужд, заменяя все подходящие файлы или типы файлов. Будьте осторожны, это очень жадный поиск

# 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