4

Я пытаюсь переименовать некоторые файлы с помощью утилиты rename (в частности, версия perl, то есть prename). К сожалению, имена файлов содержат апострофы, и это все портит. Я не уверен, как поступить.

Вот что я попробовал:

rename -n '/.*(\d\d).jpg/Foo's Excellent Photo - $1.jpg/'  # fails due to end of string
rename -n '/.*(\d\d).jpg/Foo\'s Excellent Photo - $1.jpg/' # fails due to end of string
rename -n "/.*(\d\d).jpg/Foo's Excellent Photo - $1.jpg/"  # fails due to shell expansion

Какой правильный синтаксис?

1 ответ1

4
  1. Ваш последний вариант является правильным, чтобы использовать одинарные внутри двойных кавычек - но вы также должны избегать $1 иначе оболочка его расширит:

    "/.*(\d\d).jpg/Foo's Excellent Photo - \$1.jpg/"
    
  2. Тем не менее, я все еще получаю ошибку

    Bareword found where operator expected at (eval 1) line 1, near "/.*(\d\d).jpg/Foo's"
        (Missing operator before Foo's?)
    syntax error at (eval 1) line 1, near "/.*(\d\d).jpg/Foo's Excellent "
    

    Но это не из-за неправильного цитирования, а потому, что perl-rename ожидает регулярного выражения perl. И вы, очевидно, хотите найти и заменить, так что используйте s/.../.../ , не только /.../.../ .

  3. Итак, подводя итог, эта команда работает без нареканий:

    $ rename -n  "s/.*(\d\d).jpg/Foo's Excellent Photo - \$1.jpg/" *
    PIC44.jpg renamed as Foo's Excellent Photo - 44.jpg
    PIC45.jpg renamed as Foo's Excellent Photo - 45.jpg
    

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