Como renomear múltiplos arquivos em um único comando ou script no Unix? [duplicado]

56

Eu tenho a lista abaixo de arquivos

aro_tty-mIF-45875564pmo_opt
aro_tty-mIF-45875664pmo_opt
aro_tty-mIF-45875964pmo_opt
aro_tty-mIF-45875514pmo_opt
aro_tty-mIF-45875524pmo_opt

que preciso renomear para

aro_tty-mImpFRA-45875564pmo_opt
aro_tty-mImpFRA-45875664pmo_opt
aro_tty-mImpFRA-45875964pmo_opt
aro_tty-mImpFRA-45875514pmo_opt
aro_tty-mImpFRA-45875524pmo_opt
    
por Udhayakumar 26.11.2013 / 17:19

3 respostas

71

A maioria dos shells padrão fornece uma maneira de fazer uma simples substituição de texto dentro de variáveis do shell. O link explica o seguinte:

${var/Pattern/Replacement}

First match of Pattern, within var replaced with Replacement.

Portanto, use este script para percorrer todos os arquivos apropriados e renomeie cada um deles:

for file in aro_tty-mIF-*_opt
do
    mv -i "${file}" "${file/-mIF-/-mImpFRA-}"
done

Eu adicionei uma opção -i para que você tenha a chance de confirmar cada operação de renomeação. Como sempre, você deve fazer um backup de todos os seus arquivos antes de fazer qualquer grande quantidade de renomeação ou exclusão.

    
por 26.11.2013 / 17:41
17

Se você não tiver rename do Perl:

perl -e '
FILE:for $file (@ARGV){
        ($new_name = $file) =~ s/-mIF-/-mImpFRA-/
        next FILE if -e $new_name;
        rename $file => $new_name
}' *_opt

Se você fizer ter o rename :

do Perl
rename 's/-mIF-/-mImpFRA-/' *_opt
    
por 26.11.2013 / 17:22
15

Antes de tentar comandos complexos como o seguinte, faça backup dos seus arquivos . Você nunca sabe o que um erro de digitação (meu ou seu) pode causar.

Com mv (como você pediu no comentário --- rename como sugerido na outra resposta é provavelmente mais seguro, especialmente se você pode ter espaços ou caracteres estranhos em seus nomes de arquivos) algo do estilo

for f in *_opt; do
    a="$(echo $f | sed s/-mIF-/-mImpFRA-/)"
    mv "$f" "$a"
done
    
por 26.11.2013 / 17:36