Por que o comando renomear não funciona como esperado?

1

Eu tenho alguns arquivos como:

1_suffix.txt
2_suffix.txt
3_suffix.txt

Eu quero remover o _suffix.txt neles. Eu encontrei um comando chamado rename e usei como:

Primeiro eu tentei:

rename -v 's/*_suffix.txt$/\.txt/' *.png

Não está funcionando, mas depois tentei:

rename -v 's/_suffix.txt$/\.txt/' *.png

Funcionou.

Eu acho que o segundo regexp está incorreto, mas por que funcionou?

Eu tentei usar ls:

ls _suffix.txt # not worked
ls *_suffix.txt # worked
    
por AGamePlayer 12.09.2015 / 13:08

2 respostas

1

O comando rename usa expressões regulares, não padrões glob. Embora *foo seja um padrão glob válido, não é uma expressão regular válida. O * significa "0 ou mais", mas você também precisa especificar 0 ou mais o que . Para "qualquer caractere", use . :

s/.*_suffix\.txt$/.txt/

Agora, o próximo problema é que s/_suffix.txt$/\.txt/' *.png nunca funcionará. Você está dizendo a rename para renomear todos os arquivos cujo nome termina em _suffix.txt , mas está dizendo para fazer isso com arquivos cujo nome termina com png . Isso é o que significa o *png (que é um glob e não uma expressão regular).

Acho que o que você realmente queria é:

rename 's/_suffix//' *suffix.txt

Isso substituirá _suffix por nada, ele simplesmente o excluirá, o que deve fornecer aos arquivos o nome que você deseja.

    
por 12.09.2015 / 13:19
0

Padrões glob do nome do caminho usados pelo shell do Unix são diferentes de expressões regulares na sintaxe e significados dos metacaracteres.

    
por 12.09.2015 / 13:15

Tags