Существует множество вопросов и ответов о том, как переименовывать файлы. {{1} } Я новичок в Linux, и это множество возможных способов, разных результатов и разных конфигураций смущает меня.
Например:
rename
работает, но не рекурсивно grep
работает рекурсивно, но не может использоваться для поиска по именам файлов и каталогов вместо содержимого файла find
работает, но имеет длинный уродливый синтаксис, если вы хотите искать с использованием регулярных выражений. А также многие ответы на ask ubuntu и stackoverflow у меня не работают, и я не знаю, как их отлаживать и устранять неполадки.
Так что простите меня спросить еще раз.
Я ищу чистый, запоминающийся способ:
Рекурсивное переименование файлов с использованием простого регулярного выражения .
Я уже делаю это для содержимого файлов, используя этот синтаксис:
grep -rl search_regex | xargs sed -i 's / old / new / g'
Работает без особых проблем. Работает "из коробки". Просто работает. Я ищу работоспособное, аккуратное и чистое решение. Не могли бы вы мне помочь?
Вы должны иметь возможность более или менее сохранить тот же формат, что и при использовании grep и sed, хотя я думаю, что вам все равно понадобится инструмент, например find, чтобы предоставить grep файлы для поиска.
Edit: добавлена информация из комментариев. спасибо @pLumo и @terdon за то, что они показали, что он не работает для файлов с символами новой строки в имени.
find /some/directory -print0 | grep -zE "search_regex" | rename -0 's/old/new/g'
Не могу найти ничего длинного и уродливого о find
:
find . -regex 'search_regex' -exec rename 's/old/new/g' {} +
Вы можете сделать переименовать
рекурсивным, если этот синтаксис вам больше нравится:
shopt -s globstar
rename 's/old/new/' **/*
Параметр Bash globstar
делает **
рекурсивно соответствуют 0 или более каталогам или файлам, поэтому ** / *
будет рекурсивно проходить вниз по всему дереву каталогов.Вам просто нужно написать шаблон поиска в виде глобуса, а не регулярного выражения. Например, чтобы переименовать все файлы, имя которых содержит foo
, вы должны сделать:
shopt -s globstar
rename 's/old/new/' **/*foo*