Как переименовывать файлы в ubuntu рекурсивно, используя grep и переименовывать не найти?

Существует множество вопросов и ответов о том, как переименовывать файлы. {{1} } Я новичок в Linux, и это множество возможных способов, разных результатов и разных конфигураций смущает меня.

Например:

  • rename работает, но не рекурсивно
  • grep работает рекурсивно, но не может использоваться для поиска по именам файлов и каталогов вместо содержимого файла
  • find работает, но имеет длинный уродливый синтаксис, если вы хотите искать с использованием регулярных выражений.

А также многие ответы на ask ubuntu и stackoverflow у меня не работают, и я не знаю, как их отлаживать и устранять неполадки.

Так что простите меня спросить еще раз.

Я ищу чистый, запоминающийся способ:

Рекурсивное переименование файлов с использованием простого регулярного выражения .

Я уже делаю это для содержимого файлов, используя этот синтаксис:

grep -rl search_regex | xargs sed -i 's / old / new / g'

Работает без особых проблем. Работает "из коробки". Просто работает. Я ищу работоспособное, аккуратное и чистое решение. Не могли бы вы мне помочь?

-1
задан 14 June 2021 в 08:15

3 ответа

Вы должны иметь возможность более или менее сохранить тот же формат, что и при использовании grep и sed, хотя я думаю, что вам все равно понадобится инструмент, например find, чтобы предоставить grep файлы для поиска.

Edit: добавлена ​​информация из комментариев. спасибо @pLumo и @terdon за то, что они показали, что он не работает для файлов с символами новой строки в имени.

find /some/directory -print0 | grep -zE "search_regex" | rename -0 's/old/new/g'
-1
ответ дан 28 July 2021 в 11:28

Не могу найти ничего длинного и уродливого о find:

find . -regex 'search_regex' -exec rename 's/old/new/g' {} +
3
ответ дан 28 July 2021 в 11:28

Вы можете сделать переименовать рекурсивным, если этот синтаксис вам больше нравится:

shopt -s globstar
rename 's/old/new/' **/*

Параметр Bash globstar делает ** рекурсивно соответствуют 0 или более каталогам или файлам, поэтому ** / * будет рекурсивно проходить вниз по всему дереву каталогов.Вам просто нужно написать шаблон поиска в виде глобуса, а не регулярного выражения. Например, чтобы переименовать все файлы, имя которых содержит foo , вы должны сделать:

shopt -s globstar
rename 's/old/new/' **/*foo*
1
ответ дан 28 July 2021 в 11:28

Другие вопросы по тегам:

Похожие вопросы: