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 dodos2unixcom 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 nomeYYYYMMDD.tif(são vários arquivos com datas distintas) e oforabaixo alterará o nome desses arquivos paraYYYYMMDD.tif.hard-typed. A última linha mostrará o uso do comandorename. Nota-se que a lógica é semelhante a utilizada nosed, isto é,spara substituir de uma só vez o.hard-typedpornadaouvazio(//) 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
parallelbasta 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 PIDO
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
htopbasta digitar:sudo apt install htop
Exemplo de uso:
sudo pwdx 3859Será 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
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:
Escolha
n(New remote)Em Name, escolha um nome para o remote, por exemplo:
OneDriveGui. Este nome é definido pelo usuário.Em Storage, escolha o número 21 que corresponde a Microsoft OneDrive
No campo client_id basta
pressionar enterNo campo client_secret basta
pressionar enterNo campo Edit advanced config digite
nNo campo Remote config digite
ySerá 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.
No terminal, será mostrado o campo Choose a number from below, or type in an existing value. Digite o número
1.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 enviaroutput/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.