Aplicações variadas

Descompactar um arquivo para um diretório específico

tar -zxvf arquivo.tar.gz -C <nome_diretório>

Loop com tempo

1 Loop a cada 30 minutos.

#!/bin/bash

data_inicial="202001011400" # Formato YYYYMMDDhhmm
data_final="202001011600"   

while [ ${data_inicial} -le ${data_final} ]; do

    echo  ${data_inicial}

    curr=`date -d "${data_inicial:0:8} ${data_inicial:8:2}:${data_inicial:10:2} 30 minutes " +"%Y%m%d %H:%M"`

    # Suas instruções...

    data_inicial=`date -d "${curr}" +%Y%m%d%H%M`
 
    # Recorte nas variáveis para serem utilizadas para outros fins. Esse trecho é opcional.
    ano=${data_inicial:0:4}
    mes=${data_inicial:4:2}
    dia=${data_inicial:6:2}
    hora=${data_inicial:8:2}
    min=${data_inicial:10:2}

done
  • O resultado será:

202001011400
202001011430
202001011500
202001011530
202001011600

2 Outro exemplo com loop, dessa vez, a cada 12 horas.

data_inicial="2020010100" # AAAAMMDDhh
data_final="2020010300"
 
while [ ${data_inicial} -le ${data_final} ]; do
  
    echo  ${data_inicial}

    # Suas instruções...


    data_inicial=`date -d "${data_inicial:0:8}  ${data_inicial:8:2}:00 12 hours " +"%Y%m%d%H"`   
    
done
  • O resultado será:

2020010100
2020010112
2020010200
2020010212
2020010300

3 Loop variando dia a dia.

#!/bin/bash

data_inicial="20200101" # Formato AAAAMMDD
data_final="20200110"

while [ ${data_inicial} -le ${data_final} ]
do

    echo ${data_inicial}

    # Suas intruções...

    data_inicial=`date -u +"%Y%m%d" -d "${data_inicial} 1 day "`
done
  • O resultado será:

20200101
20200102
20200103
20200104
20200105
20200106
20200107
20200108
20200109
20200110

4 Outra opção com loop variando dia a dia.

#!/bin/bash

data_inicial="2020010100" # Formato AAAAMMDD00
data_final="2020011000"

while [ ${data_inicial} -le ${data_final} ]
do

    echo ${data_inicial}

    # Suas intruções...

    data_inicial=$(date -u -d "${data_inicial:0:8} ${data_inicial:8:10}:00 24 hours" +"%Y%m%d%H")
done
  • O resultado será:

2020010100
2020010200
2020010300
2020010400
2020010500
2020010600
2020010700
2020010800
2020010900
2020011000

5 Loop ao longo das previsões do modelo GFS.

#!/bin/bash

# Ajuste os parâmetros abaixo de acordo com as suas necessidades.
PREV=0    # Horário que começa a previsão de interesse (f000).
PRAZO=384 # Quantidade de previsões em horas desejadas. São 384 horas.
dPREV=3   # Intervalo temporal em horas entre cada previsão desejada.

while [[ ${PREV} -le ${PRAZO} ]]
do
    fcst=`echo ${PREV} | awk '{printf("%.3d",$1)}'`
    
    # Adicione suas instruções.
    echo "Arquivo: gfs.t00z.pgrb2.0p25.${fcst}"
    
    let PREV=${PREV}+${dPREV}
done

# A saída será da seguinte forma:

# Arquivo: gfs.t00z.pgrb2.0p25.000
# Arquivo: gfs.t00z.pgrb2.0p25.003
# Arquivo: gfs.t00z.pgrb2.0p25.006
# Arquivo: gfs.t00z.pgrb2.0p25.009
# Arquivo: gfs.t00z.pgrb2.0p25.012
# Arquivo: gfs.t00z.pgrb2.0p25.015
# Arquivo: gfs.t00z.pgrb2.0p25.018
# Arquivo: gfs.t00z.pgrb2.0p25.021
.
.
.
# Arquivo: gfs.t00z.pgrb2.0p25.381
# Arquivo: gfs.t00z.pgrb2.0p25.384

Remover caracteres estranhos no Linux

  • Em algumas situações quando se copiam programas feitos no Windows para o Linux, alguns caracteres indesejáveis surgem, gerando o erro abaixo.

  • Supondo que o script escrito em Shell tenha sido feito no Windows com o nome de teste.sh. Ao tentar executá-lo no Linux, a mensagem de erro surgirá:

./teste.sh: line 2: $'\r': command not found

  • Esse \r é o problema. E isso pode ser resolvido por meio da instalação do dos2unix com o comando abaixo:

sudo apt install dos2unix

  • Após a instalação, basta digitar:

dos2unix teste.sh

  • Para remover os caracteres estranhos. Dessa forma, é possível utilizar o seu script sem problemas.

Saber o número de núcleos do seu processador

  • Basta digitar no terminal do Linux o comando abaixo:

nproc

Saber qual é a versão do sistema operacioanl Linux

lsb_release -rd

  • Resultado:

Description:    Ubuntu 18.04.3 LTS
Release:        18.04

Utilizar o wget com usuário e senha

wget -c -r http://www.siteexemplo.com.br/arquivos.zip --http-user=nome_usuario --http-passwd=senha_usuario

Utilizar o wget para alterar o nome do arquivo.

  • Nesse exemplo, será feito o download do arquivo precip.mon.mean.nc, e deseja-se que o mesmo tenha outro nome, isto é, prec.nc. O comando abaixo realizará essa tarefa.

wget ftp://ftp.cdc.noaa.gov/Datasets/cmap/enh/precip.mon.mean.nc -O prec.nc

Utilizar o rename para renomar arquivos em lote

  • Comando bastante útil para renomear vários arquivos de uma vez ou em lote.

  • Para instalar:

sudo apt-get install rename

  • Exemplo de uso. Supondo que se deseja realizar algumas conversões com o gdal. Os arquivos de entrada possuem o seguinte nome YYYYMMDD.tif (são vários arquivos com datas distintas) e o for abaixo alterará o nome desses arquivos para YYYYMMDD.tif.hard-typed. A última linha mostrará o uso do comando rename. Nota-se que a lógica é semelhante a utilizada no sed, isto é, s para substituir de uma só vez o .hard-typed por nada ou vazio (//) em todos os arquivos.

#!/bin/bash

for original in $(ls -1 *.tif)
do 
    gdal_translate -of GTiff -ot Float32 -b 1 -co "TILED=YES" ${original} ${original}.hard-typed
done

# Remove arquivos desnecessários.

rm -rf *.tif

# Uso do rename para renomear vários arquivos de uma vez só. O que foi feito? será substituido no nome do arquivo o ".hard-typed" por "espaço vazio" ou //.

rename 's/.hard-typed//' *.hard-typed

Forma alternativa de renomear arquivos em lote usando o loop for e basename

Imagine a seguinte lista de arquivos (6 no total) no formato NetCDF:

IGBP_c6_MAPBIOMA_v3_2001_001_RF_cnew.nc
IGBP_c6_MAPBIOMA_v3_2002_001_RF_cnew.nc
IGBP_c6_MAPBIOMA_v3_2003_001_RF_cnew.nc
IGBP_c6_MAPBIOMA_v3_2004_001_RF_cnew.nc
IGBP_c6_MAPBIOMA_v3_2005_001_RF_cnew.nc
IGBP_c6_MAPBIOMA_v3_2006_001_RF_cnew.nc

O objetivo consiste em converter do formato NetCDF para o formato tif utilizando o gdal. Lembrando que isso é apenas um exemplo de como utilizar a lógica do loop for e o uso do basename para obter apenas o nome do arquivo sem sua extensão.

Esse procedimento é feito com o script abaixo:

#!/bin/bash

for nome_arquivo in *.nc
do 
    gdal_translate -of GTiff -a_srs EPSG:4326 $nome_arquivo $(basename $nome_arquivo .nc).tif
done

O trecho do código $(basename $nome_arquivo .nc) imprime apenas o nome do arquivo sem sua extensão, lembrando que esse é o nome do arquivo de saída, resultando em:

IGBP_c6_MAPBIOMA_v3_2008_001_RF_cnew

O trecho abaixo:

$(basename $nome_arquivo .nc).tif

é o mesmo que:

IGBP_c6_MAPBIOMA_v3_2006_001_RF_cnew.tif

Utilizar o parallel no Linux

  • O parallel é excelente quando se deseja realizar várias tarefas de uma só vez.

  • Para instalar o parallel basta digitar:

sudo apt-get install parallel

Neste exemplo, será feito o uso do operador mergetime para juntar vários dias de um determinado ano.

#!/bin/bash

for ano in $(seq 2010 2018)
do
    echo "cdo -s -O mergetime RF.${ano}????00.nc tmp01.RF.${ano}.nc" >> lista.txt
done

nohup parallel -j 12 < lista1.txt > lista1.log

O valor 12 veio a partir do comando nproc que digita-se no terminal. O valor obtido divide-se por 2.

Por exemplo, ao digitar o nproc foi retornado o valor 24, e 24/2 = 12.

Este número representa o número de núcleos do seu computador.

Se você usar todos os núcleos, mas é bem provável que a sua máquina trave.

O arquivo lista.txt terá o seguinte conteúdo.

cdo -s mergtime RF.2010????00.nc tmp01.RF.2010.nc
cdo -s mergtime RF.2011????00.nc tmp01.RF.2011.nc
cdo -s mergtime RF.2012????00.nc tmp01.RF.2012.nc
cdo -s mergtime RF.2013????00.nc tmp01.RF.2013.nc
cdo -s mergtime RF.2014????00.nc tmp01.RF.2014.nc
cdo -s mergtime RF.2015????00.nc tmp01.RF.2015.nc
cdo -s mergtime RF.2016????00.nc tmp01.RF.2016.nc
cdo -s mergtime RF.2017????00.nc tmp01.RF.2017.nc
cdo -s mergtime RF.2018????00.nc tmp01.RF.2018.nc

Qual a vantagem de se fazer isso? Em vez de gerar um loop para cada ano, os 9 comandos serão executados de uma vez só, economizando tempo de máquina.

Localizar onde está sendo executado um comando

O pwdx é nativo do Linux e é excelente para identificar qual o diretório que um determinado processo foi executado.

  • Sintaxe: sudo pwdx PID

  • O PID (Process Identifier) é um número de identificação que o sistema fornece quando se executa um processo. Por exemplo, ao executar um programa, o mesmo gerará um PID.

  • Como saber o PID de um processo? Basta utilizar o htop, e verificar a primeira coluna desse comando.

    • Para instalar o htop basta digitar: sudo apt install htop

  • Exemplo de uso:

    • sudo pwdx 3859

    • Será retornado o diretório do processo PID: 3859.

    • Exemplo de retorno: /mnt/produtos/meteorologia

Configurar OneDrive para receber arquivos de uma máquina externa

Imagina transferir arquivos de uma máquina externa para o OneDrive para ser consumido por alguma aplicação. Pois é, o rclone realiza esta tarefa.

Informações sobre o rclone

https://rclone.org/onedrive/

Serviços suportados (principais)

Basta configurar cada serviço como um remote.

  • Google Drive

  • Dropbox

  • OneDrive

  • Box

  • Mega

  • Amazon S3

  • Google Cloud Storage

  • SFTP/FTP

  • WebDAV

  • Backblaze B2

  • e muitos outros

Configurar o usuário remote

Vá para o seu home digitando cd no seu terminal Linux. Em seguida, digite pwd apenas para certificar que esta no home, deve aparecer algo assim /home/<usuario>, em que <usuario> é o nome do usuário da sua máquina. Exemplo: /home/gui.

Agora, digite rclone listremotes para ver quais remotos já existem. Caso o seu remoto não esteja lista será necessário criar um. Os passos abaixo realizam esta tarefa.

Se quiser criar um novo remote (por exemplo, para o OneDrive da conta gui), digite no terminal do Linux:

rclone config

No menu interativo do rclone que será aberto responda as perguntas abaixo:

  1. Escolha n (New remote)

  2. Em Name, escolha um nome para o remote, por exemplo: OneDriveGui. Este nome é definido pelo usuário.

  3. Em Storage, escolha o número 21 que corresponde a Microsoft OneDrive

  4. No campo client_id basta pressionar enter

  5. No campo client_secret basta pressionar enter

  6. No campo Edit advanced config digite n

  7. No campo Remote config digite y

  8. Será aberto um nagevador (será informado um link no terminal), entre com as suas credenciais (usuário e senha). Dependendo da conta, se for corporativa, será necessário falar com o administrador do sistema para autorizar o acesso.

  9. No terminal, será mostrado o campo Choose a number from below, or type in an existing value. Digite o número 1.

  10. Será mostrada a mensagem

Found 1 drives, please select the one you want to use: 0: OneDrive (business)

Digite o número 0

No final, confirme e saia.

Is that okay?

Digite y

🚨 Aviso importante
Provavelmente, será mostrado um erro, mas ele pode ser ignorado.

E por fim,

Yes this is OK

Digite y

Depois, digite rclone listremotes para listar os remotes existentes.

OneDriveGui:

Depois disso, você poderá usar o novo remote no Linux, por exemplo. Copiar do computador para uma pasta no OneDrive.

rclone copy /caminho/arquivos OneDriveGui:output/modelos/gfs

Onde:

  • /caminho/arquivos é o arquivo que você deseja enviar

  • output/modelos/gfs é a pasta do OneDrive que você deseja salvar os seus arquivos. Basta colocar apenas o caminho relativo da pasta.

Observação: o rclone roda no Linux e fala diretamente com a nuvem do OneDrive.