não pode renomear arquivos com '[]' em seu nome?

5

Eu estava tentando usar a função rename no meu debian, eu procurei aqui no unix.stackexchange mas parece que a solução não é a mesma no meu cenário quais arquivos contém []

[800p]-[WOLU-H]-test1.mkv
[800p]-[WOLU-H]-test2.mkv

a saída desejada é apenas

[WOLU-H]-test1.mkv
[WOLU-H]-test2.mkv

eu tentei

rename [800p]-[WOLU-H] [WOLU-H] [800p]-*

mas continua dizendo:

Bareword found where operator expected at (eval 1) line 1, near "800p"
    (Missing operator before p?)
syntax error at (eval 1) line 1, near "800p"

Eu tentei outros, como

rename 's/[800p]-[WOLU-H]/[WOLU-H]/' [800p]-*

mas a saída também falhou

Invalid [] range "U-H" in regex; marked by <-- HERE in m/[800p]-[WOLU-H <-- HERE ]/ at (eval 1) line 1.

alguém pode me esclarecer com o processo correto? Obrigado!

UPDATE

Eu tentei isso:

rename 's/\[800p\]-\[WOLU-H\]/\[WOLU-H\]/' \[800p\]-*

mas erro:

Bareword found where operator expected at (eval 1) line 1, near "800p"
        (Missing operator before p?)
Backslash found where operator expected at (eval 1) line 1, near "p\"
Backslash found where operator expected at (eval 1) line 1, near "]\"
        (Missing operator before \?)
Backslash found where operator expected at (eval 1) line 1, near "]\"
        (Missing operator before \?)
syntax error at (eval 1) line 1, near "800p"
Unmatched right square bracket at (eval 1) line 1, at end of line
Unmatched right square bracket at (eval 1) line 1, at end of line

Eu também tentei isso:

rename "[800p]-[WOLU-H]" "[WOLU-H]" "[800p]-"*

Mas ainda erro

Bareword found where operator expected at (eval 1) line 1, near "800p"
        (Missing operator before p?)
syntax error at (eval 1) line 1, near "800p"

Eu acho que o - com numerics está bagunçando?

    
por The Wolf 16.04.2015 / 13:19

2 respostas

6

[ e ] têm um significado especial em bash e também em expressões regulares, por isso você deve ignorá-los como \[ e \] . Algo como isso deve funcionar:

rename 's/\[800p\]-\[WOLU-H\]/\[WOLU-H\]/' \[800p\]-*

Exemplo:

$ touch [800p]-[WOLU-H]-test1.mkv [800p]-[WOLU-H]-test2.mkv
$ ls
[800p]-[WOLU-H]-test1.mkv  [800p]-[WOLU-H]-test2.mkv
$ rename 's/\[800p\]-\[WOLU-H\]/\[WOLU-H\]/' \[800p\]-*
$ ls
[WOLU-H]-test1.mkv  [WOLU-H]-test2.mkv
    
por 16.04.2015 / 13:29
-1

Por que você simplesmente não usa citações? Então você não precisa escapar desses [ .

rename "[800p]-[WOLU-H]" "[WOLU-H]" "[800p]-"*

(Observe que * está fora do "..." )

EDITAR: Os comentários me fazem perceber que não funciona. Eu não entendo porque, porque funciona aqui:

$ ls -1
[800p]-[WOLU-H]-foobar.txt
[800p]-[WOLU-H]-hello.txt
[800p]-[WOLU-H]-world.txt

$ rename "[800p]-[WOLU-H]" "[WOLU-H]" "[800p]-[WOLU-H]"*

$ ls -1
[WOLU-H]-foobar.txt
[WOLU-H]-hello.txt
[WOLU-H]-world.txt

$ rename -V
rename (util-linux-ng 2.17.2)

Estou usando o CentOS 6.6, talvez seja a diferença ... De qualquer forma, desculpe pela resposta errada ...

    
por 16.04.2015 / 15:03

Tags