'renomeia' em arquivos com apóstrofos

4

Estou tentando renomear em lote alguns arquivos usando o utilitário rename (especificamente a versão perl, ou seja, prename ). Infelizmente, os nomes dos arquivos contêm apóstrofos e estão atrapalhando as coisas. Não tenho certeza de como proceder.

Veja o que eu tentei:

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

Qual é a sintaxe correta?

    
por nomen 26.10.2013 / 05:48

1 resposta

4
  1. Sua última variante é a correta para usar aspas duplas internas - mas você tem que escapar também do $1 caso contrário o shell irá expandi-lo:

    "/.*(\d\d).jpg/Foo's Excellent Photo - \.jpg/"
    
  2. No entanto, ainda recebo o erro

    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 "
    

    Mas isso não é por causa de citações erradas, mas porque perl-rename espera um regex perl. E você obviamente deseja pesquisar e substituir, portanto, use s/.../.../ , não apenas /.../.../ .

  3. Então, resumindo, esse comando funciona perfeitamente:

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

Tags