Altera o nome do arquivo no Linux

1

Eu tenho muitos dados com nomes de arquivos como este:

20110.bil
20111.bil
20112.bil
...
2011150.bil
2011151.bil
2011152.bil

O padrão do nome do arquivo acima é:

year+(0-152)

0-152 significa 1 de agosto a 31 de dezembro.

Eu quero mudar esse nome de arquivo para

20110801.bil
20110802.bil
20110803.bil
............
............
20111229.bil
20111230.bil
20111231.bil

O padrão do nome do arquivo que eu quero é:

year+month+day.

Como resolvo meu problema?

    
por ahmad 27.04.2014 / 06:50

2 respostas

1

Que tal esta solução Bash?

#!/bin/bash

shopt -s nullglob extglob
for file in +([[:digit:]]).bil; do
    file_noext=${file%.bil}
    year=${file_noext::4}
    day=${file_noext:4}
    [[ -z $day ]] || ((0<=day && day<=152 && ${#year}==4)) || { echo "Error with file $file"; continue; }
    newname=$(date -d "$year-08-01 + $day days" '+%Y%m%d.bil')
    echo mv -nv "$file" "$newname"
done
  • Isso fará o loop de todos os arquivos do formulário X.bil , em que X é um número (composto apenas por dígitos).
  • Para cada arquivo e depois de extrair a extensão .bil , extraímos os primeiros quatro caracteres (o year ) e obtemos os dígitos restantes na variável day .
  • Em seguida, há uma linha que verifica se está tudo ok ( day não está vazio, entre 0 e 152 e year tem 4 caracteres).
  • Depois disso, usamos o utilitário date (esperamos que você tenha um date inteligente como o meu que pode realizar aritmética com datas, aqui adicione dias a um determinado).
  • Finalmente, realizamos a renomeação (bem, deixei um echo na frente de mv , para que o comando seja mostrado apenas, não executado; remova o echo se estiver satisfeito com ele).

Teste. Chamei esse script de banana (com echo removido) e chmod +x banana . Então:

$ mkdir scratch
$ cd scratch
$ touch 2011{0,42,100,151}.bil
$ ls
20110.bil  2011100.bil  2011151.bil  201142.bil
$ ./banana
'20110.bil' -> '20110801.bil'
'2011100.bil' -> '20111109.bil'
'2011151.bil' -> '20111230.bil'
'201142.bil' -> '20110912.bil'
$ ls
20110801.bil  20110912.bil  20111109.bil  20111230.bil

Parece bom!

    
por 27.04.2014 / 10:00
0

O script a seguir fará isso para você:

 #!/bin/bash


 > out.txt
 while read line; do
    mytmp=$(echo $line | sed 's/.bil$//' | sed 's/^2011//' )
    echo $mytmp
    if [ $mytmp -lt 31 ]; then
            MONTH=08
            DAY=$(( $mytmp + 1))
    elif  [ $mytmp -lt 61 ]; then
            MONTH=09
            DAY=$(( $mytmp - 30 ))
    elif  [ $mytmp -lt 92 ]; then
            MONTH=10
            DAY=$(( $mytmp - 60 ))
    elif  [ $mytmp -lt 122 ]; then
            MONTH=11
            DAY=$(( $mytmp - 91 ))
    elif  [ $mytmp -lt 153 ]; then
            MONTH=12
            DAY=$(( $mytmp -121 ))
    fi
    echo "2011$MONTH$DAY.bil" >> out.txt

 done < data

Funciona assim: ele lê um arquivo chamado dados linha por linha, e coloca sua saída em um arquivo chamado out.txt (mude isso para melhor você). A primeira linha limpa o arquivo de saída, depois lê o arquivo de dados retirando a string da inicial 2011 e da final .bil . O que resta é o dia da codificação. Então, dependendo da codificação do dia, ele determina o mês e o dia correspondentes, e reconstrói a string por

 2011 , anexando  .bil , e colocando a string final no arquivo  output.txt . 

    
por 27.04.2014 / 10:00

Tags