У меня есть пара файлов с именем

(a).1
(a).2
...
(a).100

Поскольку многим инструментам обработки не очень нравится ( и ) имя файла, я подумал, что лучше переименовать их в другое имя. Я гуглил для переименования файлов и нашел замечательный инструмент rename где я могу кормить регулярное выражение. Хорошо, давайте попробуем это:

$ rename -v s/\(a\)/b/ \(a\).* 

(a).1 renamed as (b).1
(a).2 renamed as (b).2
(a).3 renamed as (b).3

Хм, не то, что я ожидал. После небольшого поиска я обнаружил, что \( \) является оператором группировки. Какой вид имеет смысл, поскольку я не избежал ( ) в команде.

Я решил проблему с переименованием, используя . символ, соответствующий всем типам значений:

rename -v s/.b./b/ \(b\).*

Это решение не очень приятно. Итак, как мне сопоставить ( и ) в Bash/Linux/Unix Regex?

1 ответ1

1

Вот что вам нужно:

find -name "(*)*" -type f | rename 's/\(|\)//g'

Сначала он находит файлы в текущем каталоге, соответствующие описанному имени, а затем переименовывает их, удаляя скобки. Вы видите, что соответствующие символы (и) заменены ничем.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .