Renomeando vários arquivos com nomes numerados complexos

6

Eu tenho 365 arquivos nomeados

MOD11A1.A2010001.h24v06.006.2016025150444.hdf
MOD11A1.A2010002.h24v06.006.2016025151748.hdf
MOD11A1.A2010003.h24v06.006.2016025163706.hdf

e quero renomear esses arquivos como:

modis1.hdf
modis2.hdf
modis3.hdf

Estou usando o comando mv separadamente para cada arquivo para renomeá-los.

Como posso conseguir isso de uma só vez?

    
por Vaishali Jain 21.11.2017 / 11:29

5 respostas

10

Como você só se importa com o A2010... bit, usando rename no diretório com os arquivos:

rename -n 's/.*A2010*(\d+).*/modis.hdf/' *

Exemplo:

$ rename -n 's/.*A2010*(\d+).*/modis.hdf/' *
rename(> MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis1.hdf)
rename(> MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis2.hdf)
rename(> MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis3.hdf)
rename(> MOD11A1.A2010365.h24v06.006.2016025150444.hdf, modis365.hdf)

Execute sem -n para realmente renomear os arquivos.

    
por muru 21.11.2017 / 12:13
6

A maneira a seguir usa expansão de parâmetro bash, mas depende de seus nomes de arquivos estarem exatamente no formato que você indicou, pois depende do posicionamento da sequência numérica a ser usada. Este não é necessariamente o método mais robusto. Você também deve estar no diretório que contém os arquivos.

for f in MOD*.hdf; do
  num="${f:13:3}"
  mv "$f" modis"$((10#$num))".hdf
done

Ou como um verso:

for f in MOD*.hdf; do num="${f:13:3}"; mv "$f" modis"$((10#$num))".hdf ; done

Isso moverá os arquivos da maneira que você pediu, o que significa que MOD11A1.A2010001.h24v06.006.2016025150444.hdf se tornará modis1.hdf , MOD11A1.A2010002.h24v06.006.2016025151748.hdf se tornará modis2.hdf etc.

    
por Arronical 21.11.2017 / 12:06
6

Você pode usar o comando rename da seguinte forma:

$ rename -n 's/MOD11A1\.A2010(...)\..*/modis.hdf/' MOD*.hdf
rename(MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis001.hdf)
rename(MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis002.hdf)
rename(MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis003.hdf)

Após o teste, remova -n para realmente renomear arquivos.

Notas

  • s/old/new replace old com new
  • \. literal .
  • ... três caracteres que poderiam ser qualquer coisa
  • (some chars) save some chars para referência posterior com
  • Poderíamos usar uma regex simples para corresponder à primeira parte do nome do arquivo no comando rename , como a resposta de muru. Às vezes, você quer usar uma expressão mais explícita para distinguir entre arquivos que você quer ou não, ou para ter certeza de que seu regex não irá sugar muitos caracteres. Geralmente há muita flexibilidade para resolver esse tipo de problema.

Observe que isso não oferece exatamente o que você pediu; mantém a largura fixa dos números. Eu fiz isso porque é uma boa idéia usar números de largura fixa em nomes de arquivos (caso contrário, eles serão classificados de forma confusa, com 10 antes de 2, por exemplo) (e porque eu não descobri como use rename para criar os nomes que você realmente pediu ... se eu fizer, atualizarei minha resposta resposta de muru faz isso ...).

Note que Perl rename não está incluído na instalação padrão 17.10 , portanto, se você estiver executando 17.10 (ou para futuros leitores, talvez uma versão posterior), comece executando

sudo apt install rename
    
por Zanna 21.11.2017 / 12:13
5

O código abaixo fará o seguinte:

  1. execute o loop sobre todos os arquivos que começam com MOD e terminam com .hdf
  2. Atribuir uma variável, que aumentará seu valor em 1 para cada arquivo
  3. execute o comando mv no arquivo atual na lista e altere seu nome para modis segue pelo número da variável, segue o .hdf

    #!/bin/bash 
    idx=1
    for file in MOD*.hdf
    do
        echo mv "$file" "modis$((idx++)).hdf"
    done
    

Observação: o script acima será apenas echo do comando planejado, você precisará remover o echo da linha echo mv para executar a ação.

Exemplo de saída:

mv MOD11A1.A2010001.h24v06.006.2016025150444.hdf modis1.hdf
mv MOD11A1.A2010002.h24v06.006.2016025151748.hdf modis2.hdf
mv MOD11A1.A2010003.h24v06.006.2016025163706.hdf modis3.hdf
    
por Yaron 21.11.2017 / 11:38
-2

Eu criei o seguinte código. Confio que o leitor esteja familiarizado com a expressão regular no comando grep .

#!/bin/bash
declare -i Num
ls  | grep '.*MOD11A1.A201.*hdf' | while read fName
do
  step1=${fName##*MOD11A1.A201}
  Num=${step1%%.*}
  mv ${fName} modis${Num}.hdf
done
    
por WillemK 21.11.2017 / 12:42