Remover prefixos dos nomes de arquivos

10

Eu tenho vários arquivos da seguinte maneira:

04602635_b0294.DAT20120807164534
04602637_b0297.DAT20120807164713
04602638_b0296.DAT20120807164637
04602639_b0299.DAT20120807164819
04602640_b0298.DAT20120807164748
04602641_b0300.DAT20120807164849
04602650_b0301.DAT20120807164921
04602652_b0302.DAT20120807164956

Eu preciso renomeá-los para excluir o prefixo. Ele precisa ficar assim ..

b0294.DAT20120807164534
b0297.DAT20120807164713
b0296.DAT20120807164637
b0299.DAT20120807164819
b0298.DAT20120807164748
b0300.DAT20120807164849
b0301.DAT20120807164921
b0302.DAT20120807164956

EDITAR

Esqueci de acrescentar que estou usando o Solaris.

Pieter van Niekerk
fonte

Respostas:

19
for file in * ; do
    echo mv -v "$file" "${file#*_}"
done

execute isso para garantir que está tudo bem.
se for, remova echodo comando e renomeará os arquivos como desejar.

"${file#*_}"

é um recurso de substituição usual no shell. Remove todos os caracteres antes do primeiro _símbolo (incluindo o próprio símbolo). Para mais detalhes veja aqui .

pressa
fonte
Poderia explicar o que exatamente está acontecendo "${file#*_}"?
Pieter van Niekerk
Eu adicionei explicação para a minha resposta.
apressar
Na IMO, a maioria dos scripts deve ser escrita para ecoar a saída de comando desejada. Mas não remova o echo, basta canalizar a saída do script bash.
Jim L.
7

Você pode usar a ferramenta renamepara isso:

rename "s/.*_//" *

Se você anexar, -nele não renomeará nada e apenas mostrará o que teria sido feito sem -n.

Em resposta ao comentário do rush: my renameis é na verdade um link para prenameo perlpacote do Debian e do Ubuntu .

scai
fonte
5
Observe que renamenem sempre é o mesmo em sistemas diferentes e, às vezes, sua sintaxe pode ser diferente.
apressar
11
O autor da pergunta acrescentou que está usando o Solaris. Portanto, este comando de renomeação (que é específico para o Debian e derivados) não está disponível para ele.
Gilles 'SO- stop be evil' -
11
... a menos que ele consiga construí-lo a partir da fonte.
sendmoreinfo
O @Gilles perl-renamenão é nada específico para o Debian. Não é apenas chamado, renamemas perl-renameou prenameem outras distribuições. No entanto, sempre deve estar nos repositórios e um também é instalado com perl .
terdon
@terdon Um comando para renomear arquivos cujo uso básico é uma expressão perl não é específico para o Debian. Esse comando, chamado renamee provavelmente será instalado sem solicitar explicitamente um pacote que não é chamado apenasrename , é específico do Debian. Outras distribuições Linux chamam o comando prenameou perl-renamepara evitar confusão com o util-linux renamee não o empacotam com o pacote perl, e não conheço nenhum unix que não seja Linux que o envie sob o nome renameou o envie em um instalação padrão com qualquer nome.
Gilles 'SO- stop be evil'