Como renomear vários arquivos removendo caracteres no bash?


10

Eu tenho que renomear vários arquivos no diretório removendo os primeiros 5 caracteres para cada nome de arquivo.
Como posso fazer isso no bash / shell? Estou usando o Ubuntu 11.10. Obrigado.

Respostas:


11

Um loop for simples com um pouco de sedirá fazer o truque:

% touch xxxxx{foo,bar,baz}
% ls -l xxxxx{foo,bar,baz}
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbaz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxfoo  
% for file in xxxxx*; do mv $file $(echo $file | sed -e 's/^.....//'); done
% ls -l foo bar baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 bar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 foo

O regex substituto em seddiz para corresponder a cinco caracteres ( .significa qualquer caractere) no início da string ( ^) e removê-lo.


9

O Bash tem algumas possibilidades incríveis de script. Aqui está uma maneira:

for file in ??????*; do mv $file `echo $file | cut -c6-`; done

Uma maneira útil de testar o que faria é adicionar um eco na frente do comando:

for file in ??????*; do echo mv $file `echo $file | cut -c6-`; done

Os seis pontos de interrogação garantem que você tente fazer isso apenas com nomes de arquivos com mais de 5 caracteres.


5

Você pode usar o sed para fazer isso

for file in * ; do mv $file  $(echo $file |sed 's/^.\{5\}//g'); done

5

Ótimas respostas, obrigado. Isto é o que funcionou no meu caso:

rename 's/^.......//g' *

1

Meus dois centavos':

for file in *; do mv $file ${file:5}; done

${file:n}remove os primeiros ncaracteres da string file.


resposta mais elegante.
Sanduíche
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.