baseado em padrão, renomeação de arquivo em lote no terminal

34

Eu preciso renomear o seguinte:

file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png

em

upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png

Como posso fazer isso com apenas uma linha simples de comando de terminal?

    
por Unamata Sanatarai 19.04.2013 / 12:19

3 respostas

56

A solução para o exemplo acima, usando renomear :

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

Uso:

rename [options] [Perl regex search/replace expression] [files]

De man rename :

   -v, --verbose
           Verbose: print names of files successfully renamed.
   -n, --no-act
           No Action: show what files would have been renamed.

renomear pode ter regex como os argumentos.

O que estamos vendo é o conteúdo entre aspas simples ' . Você pode colocar o regex separado por / .

Fórmula: s/(1)/(2)/ em que (1) = padrão de pesquisa e (2) = substituir padrão.

Então, familiarize-se com a regex e aproveite a renomeação de arquivos em lote com base em padrões!

    
por Unamata Sanatarai 19.04.2013 / 12:19
5

Isso pode ser feito com pouca mágica na expansão do parâmetro bash!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*; - O primeiro padrão é usado para percorrer todos os arquivos que começam com 'file_anynumber_'
${f#file_[0-9]*_} - O segundo padrão file_[0-9]*_ é usado na expansão de parâmetro que informa ao bash para remover 'file_anynumber_' do implorando da corda.

Para mais informações sobre Parameter expansion :

man bash
    
por Basharat Sialvi 19.04.2013 / 13:53
3

se os arquivos estiverem em diretórios de vários usuários, use renomear depois de um encontro como:

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl/' {} \;

o -n após renomear é testar, remova-o para continuar! -)

assim, você associa encontrar e renomear poder.

Pessoalmente, usei-o para renomear o cabeçalho de fontes .h para .hpp

find -iname *.h -type f -exec rename 's/(.*\.)h/hpp/' {} \;
    
por bcag2 22.09.2016 / 16:09