Como renomeio vários arquivos removendo caracteres no bash?

10

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

    
por wlk 29.12.2011 / 18:59

5 respostas

11

Um simples loop for com um pouco de sed fará 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 substituto regex em sed diz que combina cinco caracteres ( . significa qualquer caractere) no inicie a string ( ^ ) e remova-a.

    
por 29.12.2011 / 19:14
9

O Bash tem algumas incríveis possibilidades 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

As seis interrogações garantem que você só tente fazer isso com nomes de arquivos com mais de 5 caracteres.

    
por 29.12.2011 / 19:15
5

Você pode usar sed para fazer isso

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

Todas ótimas respostas, obrigado. Foi isso que funcionou no meu caso:

rename 's/^.......//g' *
    
por 29.12.2011 / 19:57
0

Meus dois centavos ':

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

${file:n} remove os primeiros caracteres n na string file .

    
por 14.07.2017 / 08:31

Tags