Como posso renomear arquivos em lote no bash?

5

Eu tenho alguns arquivos assim:

database1-backup-01-01-2011.sql
database2-backup-01-01-2011.sql

... etc. Quero renomeá-los para adicionar AM, assim:

database1-backup-01-01-2011-AM.sql
database2-backup-01-01-2011-AM.sql

Qual é a maneira mais concisa de fazer isso a partir do bash shell?

    
por Nathan Long 02.03.2011 / 15:18

4 respostas

13

Outra opção:

for i in *.sql ; do
    mv -v $i ${i%.sql}-AM.sql
done

Isso percorre todos os arquivos .sql e os renomeia para terminar em -AM.sql.

PROTIP: Use $(command) em vez de 'command' em seus scripts (e linhas de comando), faz citações e foge menos de um pesadelo.

    
por 02.03.2011 / 15:37
7

Experimente este pequeno script:

#!/bin/sh

FILES='ls *.sql'
for FILE in ${FILES}
{
    BASE='basename ${FILE} .sql'
    mv ${FILE} ${BASE}-AM.sql
}

Acabei de digitar isso da memória, por isso, se ele não funcionar, 100% não me culpe (ou seja, faça backup dos seus dados primeiro;))

Como funciona:

Colete todos os arquivos em uma variável (você poderia colocar isso dentro do for, mas eu gostaria de manter as coisas fáceis de ler):

FILES='ls *.sql'

Repetir cada arquivo:

for FILE in ${FILES} { ... }

Obtenha o nome do arquivo sem .sql:

BASE='basename ${FILE} .sql'

Renomeie o arquivo, adicionando -AM.sql ao nome base:

mv ${FILE} ${BASE}-AM.sql
    
por 02.03.2011 / 15:30
4

Usando a versão Script Perl de rename :

rename 's/\.sql$/-AM$&/' *.sql

Usando a versão util-linux-ng de rename (mas somente se" .sql "aparecer somente no final do nome do arquivo):

rename .sql -AM.sql *.sql

Usando mmv :

mmv '*.sql' '#1-AM.sql'
    
por 02.03.2011 / 17:07
1

Como um script Perl foi sugerido, aqui está um script Ruby para fazer o mesmo:

'ls *.sql'.split("\n").each do |filename|
  new_filename = filename.split('.').join('-AM.')
  'mv #{filename} #{new_filename}'
end
    
por 23.03.2011 / 15:31

Tags