%20%D1%81%20%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%BC%20%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20Unix%2FLinux.png)
У меня есть пара файлов с названием
(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
Вот что вам нужно:
find -name "(*)*" -type f | rename 's/\(|\)//g'
Сначала он находит файлы в текущем каталоге, соответствующие описанному имени, затем переименовывает их, удаляя скобки. Вы можете видеть, что соответствующие символы ( и ) заменяются ничем.