Busca de arquivos no Linux e Unix

Deixe um comentário

Find

Diferente do comando “ls”, que apenas lista o conteúdo, o “find” realiza uma busca por arquivos e diretórios. Existem algumas funcionalidades bastante úteis como fazer buscas com datas ou parte dos nomes dos arquivos.

Existem parâmetros para isso “atime” que especifica dias e “amin” que especifica mínutos, ambos contados do último acesso, existe também o “ctime” e “cmin” que leva em consideração a última alteração do arquivos.

Buscas simples


Pelo nome do arquivo ou diretório

$ find / -name *.txt

esse comando irá buscar todos os arquivos com extensão “txt”, onde “/” é o local a partir do qual a busca será realizado.

Somente os diretórios

A linha abaixo busca e exibe somente os diretórios:

$ find . -type d

o “.” diz que o diretório inicial é o diretório atual.

Somente os arquivos

A linha abaixo busca e exibe somente os arquivos:

$ find . -type f

Buscas baseadas em data


Existem alguns parâmetros uteis para buscas com datas: o “atime” que especifica dias e  o “amin” que especifica mínutos, ambos contados do último acesso. O “ctime” e “cmin” que leva em consideração a última alteração do arquivos. Os valores são descritos abaixo:

  • +N: mais de N dias ou minutos;
  • N: entre N e N+1 dias ou minutos;
  • N: até N dias ou minutos.

Busca somente os modificados nas últimas 24 horas

Serão exibidos apenas os arquivos e diretórios criados ou modificados nas últimas 24 horas.

$ find . -type f

Busca somente os modificados nas últimos 10 minutos

Serão exibidos apenas os arquivos e diretórios criados ou modificados nas últimos 10 minutos.

$ find . -mmin -5

Busca somente hoje (a partir das 00:00h)

$ find . -daystart

Busca dos mais novos

$ find . -newer /usr/local/teste.log

mostra os arquivos, no diretório atual, que são mais novos “que teste.log”.

Alternativas complexas


Execução de um comando a partir do resultado da busca

$ find . -name *.pdf -exec ls -l {} \;

o parâmetro “-exec” informa a execução do comando.

Confirmação de execução de comando

A opção de execução de comando é possível solicitar um confirmação para a execução.

$ find . -name *.gif -ok rm {} \;

Nesse caso, o resultado da busca será excluído, mas para isso será solicitado confirmação para isso:

<rm ... . arquivo.gif > ?

Busca com exibição de lista

A opção é similar ao comando “ls -lR *.pdf”, exibindo-os de forma estendida:

$ find . -name *.pdf -exec ls -l {} \;

Copiar o resultado

$ find . | cpio -pdumv /<diretório-de-destino>

Nessa opção o resultado será copiado para o diretório de destino.

Contexto no Weblogic 11g

Deixe um comentário

No Weblogic, por padrão, em aplicações web o contexto é o mesmo do nome do war que foi instalado. Para ser alterar o contexto da aplicação é necessário criar um arquivo XML chamado weblogic.xml no WEB-INF que conterá o contexto a ser utilizado. Segue abaixo exemplo do arquivo:

<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd">
  <session-descriptor></session-descriptor>
  <jsp-descriptor></jsp-descriptor>
  <container-descriptor></container-descriptor>
  <context-root>contextoapp</context-root>
</weblogic-web-app>

Informações sobre o S.O. baseados em Unix

Deixe um comentário

Conteúdo


O comando “uname” é responsável por exibir informações dos sistemas operacionais baseados em Unix

Básico


uname -a
Exibe todas as informações da máquina.

No Solaris:

$ uname -a
SunOS hostMachine435 5.8 Generic_117350-18 sun4u sparc SWNW, Sun-Fire-280R

No Linux:

$ uname -a
Linux samplehost 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:14 EST 2007 x86_64 x86_64 x86_64 GNU/Linux

uname -r
Exibe o host da máquina

$ uname -r
sample host

uname -i
No Linux irá exibir a arquitetura do SO é i_386 ou x86_64. No Solaris exibe qual tipo de servidor

$ uname -i
SUNW, Sun-Fire-V490

Versões


uname -r
No Linux exibe o release do kernel:

$ uname -r
2.6.18-8.el5

No Solaris é a versão do SO:

$ uname -r
8.1

para a versão do kernel no Solaris utiliza-se:

$ uname -v
Generic_117350-18

[Vivendo e aprendendo 1 - Unix based] Script de Transmissão via SFTP no terminal

Deixe um comentário

A intenção desse blog sempre foi “guardar” para o futuro e obviamente compartilhar coisas que aprendemos no dia-a-dia do trabalho em TI.

Nesse post esta detalhado um script simples que criei para transferir arquivos, via terminal, por SFTP entre dois servidores Unix – poderia ser Linux. O script é bem simples, mas a intenção de publica-lo foi explicar os macetes:

#!/usr/bin/bash

SFTP_USER=usuario
SFTP_HOST=10.0.0.1
SFTP_PASS=senha
SFTP_SRHOME=/home/origem
BATCH_FILE=batchtemp
DATE_WORK=`TZ=EST26EDTdate +%Y%m%d`
DEST_DIR=/home/destino
LOG_FILE=./log-`date +%Y%m%d%k%M%S`.log

function createBatchFile {

    cp /dev/null $BATCH_FILE
    echo "cd $DEST_DIR" > $BATCH_FILE

    for foundedFiles in `find $SFTP_SRHOME -name "*_$DATE_WORK_*" -exec ls -tr {} \;`
    do
        echo "put $foundedFiles" >> $BATCH_FILE
    done

    echo "bye" >> $BATCH_FILE

}

function sendFTP {

    expect &> ${LOG_FILE} <<EOF
        spawn sftp -oBatchMode=no -b $BATCH_FILE $SFTP_USER@$SFTP_HOST
        expect {
            "password:"
            {
                send "${SFTP_PASS}\n"
            }
        }
    expect eof
EOF

}

createBatchFile
sendFTP

Explicando:

Endereço do servidor remoto – para onde irão ser transferidos os arquivos:

SFTP_HOST=10.0.0.1

Usuário do SFTP que irá se conectar no servidor remoto:

SFTP_USER=usuario

Senha do usuário de SFTP:

SFTP_PASS=senha

Local onde estão os arquivos que serão transferidos:

SFTP_SRHOME=/home/origem

Arquivo temporário que irá armazenar os comandos do SFTP:

BATCH_FILE=batchs=/home/origem

Data do dia anterior no formato AAAAMMDD:

DATE_WORK=`TZ=EST26EDT date +%Y%m%d`

Diretório destino dos arquivos a serem transferidos:

DEST_DIR=/home/destino

Arquivo que irá guardar o histórico da transferência, o nome do arquivo ser “log-AAAAMMDDHHMMSS.log”:

LOG_FILE=./log-`date +%Y%m%d%k%M%S`.log

Função que cria o arquivo temporário com os comandos do SFTP:

function createBatchFile {

Cria ou zera o arquivo de batch:

cp /dev/null $BATCH_FILE

Inclui ao arquivo de batch a instrução para mudar de diretório do servidor de destino:

echo "cd $DEST_DIR" > $BATCH_FILE

Traz uma lista de arquivos que contenham em seu nome a data do dia anterior e os armazena na variável foundedFiles, um detalhe importe é o “do” na linha seguinte, isso é obrigatório! Caso se deseje o “do” na mesma linha do “for” é necessário haver um “;”, ou seja “for foundedFiles in `find $SFTP_SRHOME -name “*_$DATE_WORK_*” -exec ls -tr {} \;`; do”

Em seguida é adicionado ao arquivo de batch o comando “put <nome do arquivo a ser transferido>” :

for foundedFiles in `find $SFTP_SRHOME -name "*_$DATE_WORK_*" -exec ls -tr {} \;`
  do
    echo "put $foundedFiles" >> $BATCH_FILE
done

Finaliza o arquivo batch com a instrução de saída do SFTP.

echo "bye" >> $BATCH_FILE

Função que efetivamente envia os arquivos, a função o comando SFTP se conecta ao servidor remoto e executa as instruções do arquivo batch

function sendFTP {

O comando expect cria um espécie de robô que responde aos prompts do aplicativo, nesse caso ele faz log no arquivo LOG_FILE. É interessante notar que a opção “&>” diz que a saída padrão e de erro são armazenadas nesse mesmo arquivo:

expect &> ${LOG_FILE} <<EOF

A diretiva spawn habilita o preenchimento automático de prompts de aplicação, como uma espécie de robô. Nesse caso o SFTP solicita a senha do usuário com  “password:” e a instrução send envia a resposta ao prompt

O “expect eof” aponta o final do tratamento de prompts, e o EOF termina o expect, importante o EOF tem que estar na primeira coluna, ou seja, não pode estar identado:

    expect eof
EOF

As linhas abaixo executam as funções:

createBatchFile
sendFTP

[Unix based] Busca e leitura dos arquivos

Deixe um comentário

Como utilizo muito terminal  Solaris no trabalho e Ubuntu em casa, um pequeno script é muito útil quando fazemos uma busca por arquivos e no resultado queremos saber qual deles tem um determinado texto dentro:

$ for i in `find . -name '*.trc' -ls | grep 'Apr 22' | awk -F" " '{ print $9 }'`; do grep "texto" $i; done

excplicando:

for i in # loop com a iteração em i

`find . -name ‘*.trc’ -exec -ls -l {}; | grep ‘Apr 22′ | aw’k -F” ” ‘{ print  $8}’`; # primeiro procure, a partir do diretório atual todos arquivos com extensão .trc e os mostre utilizando um “ls -l”, na lista filtre os arquivos pela data de 22 de abril e por fim exiba somente a 8 coluna da lista, usando espaço como separador de colunas.

do grep “texto” $i; # a partir do resultado da linha acima faz uma busca do texto em cada arquivo

done # final do for

Um observação importante é que a data e a quantidade de colunas pode variar de acordo com o sistema operacional.

Estratégia empresarial

Deixe um comentário

Durante a semana do Empreendedorismo tive a oportunidade de visitar uma pequena empresa que não é muito nova e desde seu nascimento utilizou uma estratégia profissional baseada em uma única experiência profissional do sócios e isso esta lhe causando muitos transtornos: falta de clientes, nenhum retorno financeiro, mesmo tendo um produto bom e completo.
Muitas pessoas sonham em ter sua própria empresa – e esse é um sonho muito bom – mas com um mundo altamente competitivo e com grandes cabeças pensantes trabalhando para grandes corporações eu acredito que, mesmo sendo uma empresa de fundo de quintal é necessário ter planejamento estratégico e de marketing ou algum diferencial no seu produto ou serviço que proporcione um novo mercado.
Em muitas ocasiões o ditado “de boas intenções o inferno esta cheio” cai bem para muitas situações do mundo empresarial, onde o amadorismo pode levar a grandes decepções, perda de dinheiro e energia.
Um outro grande ponto com relevância é a possibilidade de adaptação ao “meio” onde todos os tomadores de decisão tem que estar preparados para grandes mudanças, ver com bons olhos e estar aberto para novas possibilidades, e nunca esquecer que empreendedor ou um funcionário, por mais simples que for o cargo, somos parte de um organismo vivo e temos que temos que estar em comunhão com todas as partes para que o todo funcione perfeitamente.
Para finalizar, segue uma sugestão de consultoria para empreendedores que é o SEBRAE e o livro Estratégia do Oceano Azul que trata sobre criar novos mercados de consumo e a “necessidade” do produto/serviço para os clientes,

Procedure Oracle comentada

Deixe um comentário

Segue uma procedure Oracle funcional que faz expurgo e cria novas partições para uma determinada tabela, isso é muito útil como fonte de consulta:

CREATE OR REPLACE PROCEDURE pr_purge_gwbroadgacpartitions (dataref NUMBER) IS

TYPE tVetor IS VARRAY(100) of VARCHAR2(5); -- Cria um tipo como array.

mmddref VARCHAR2(4);
dataref_ini DATE;
dataref_end DATE;
part_name_one VARCHAR2(9);
sqlcmd VARCHAR2(500);
year_ini VARCHAR2(4);
year_now VARCHAR2(4);
instances_pa tVetor; -- Define uma variável como array
v_future_date VARCHAR2(9);
num_rows integer;

--Cursores que fazem interação no resultado do SELECT
CURSOR parts_cur_same_year(part_name IN VARCHAR2, inst IN VARCHAR2) RETURN  user_tab_partitions%ROWTYPE IS
SELECT * FROM user_tab_partitions WHERE table_name = 'STATUS_REPO' and partition_name &amp;lt; part_name and partition_name LIKE inst ORDER BY partition_name ASC;

CURSOR parts_cur_another_year(part_name IN VARCHAR, inst IN VARCHAR2) RETURN user_tab_partitions%ROWTYPE IS
SELECT * FROM user_tab_partitions WHERE table_name = 'STATUS_REPO' and partition_name &amp;gt; part_name and partition_name LIKE inst ORDER BY partition_name ASC;

parts_record user_tab_partitions%ROWTYPE; -- Define a variável como tipo linha da tabela

BEGIN

dataref_ini := TO_DATE(dataref,'YYYYMMDD') - 91; -- Transforma o parâmetro informado como string em data e subtrai dias.

year_ini := TO_CHAR(dataref_ini, 'YYYY'); -- Recupera o ano da data como string.

year_now := TO_CHAR(SYSDATE, 'YYYY');

instances_pa := tVetor('PART1', 'PART2', 'PART3', 'PART4', 'PART5'); -- Inicializa o array

--Verifica o ano do parametro e o mesmo do ano atual da maquina, essa verificacao e importante porque a particao nao informa o ano.
IF year_ini = year_now THEN

mmddref := TO_CHAR(dataref_ini,'MMDD'); -- Mes e ano da data informada.

FOR i IN instances_pa.FIRST..instances_pa.LAST -- navega entre as instâncias do gateway.
LOOP

part_name_one := instances_pa(i) || mmddref; -- Nome da instancia mais dia e mes.

OPEN parts_cur_same_year(part_name_one, instances_pa(i) || '%'); -- Executa o cursor

LOOP -- Faz loop do cursor
BEGIN
FETCH parts_cur_same_year INTO parts_record; -- Armazena cada linha  na variável

EXIT WHEN (parts_cur_same_year%NOTFOUND) OR (parts_cur_same_year%ROWCOUNT = 0);

sqlcmd := 'ALTER TABLE STATUS_REPO DROP PARTITION ' || parts_record.partition_name; -- Apaga a partição

EXECUTE IMMEDIATE sqlcmd;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(sqlerrm);
END;

COMMIT;

END LOOP;

CLOSE parts_cur_same_year;

END LOOP;

ELSE

dataref_end := TO_DATE(dataref,'YYYYMMDD') + 91; -- Caso os anos sejam diferentes ele dropa as particoes a frente

mmddref := TO_CHAR(dataref_end,'MMDD');

FOR i IN instances_pa.FIRST..instances_pa.LAST
LOOP

part_name_one := instances_pa(i) || mmddref;

OPEN parts_cur_another_year(part_name_one, instances_pa(i) || '%');

LOOP
BEGIN
FETCH parts_cur_another_year INTO parts_record;

EXIT WHEN (parts_cur_another_year%NOTFOUND) OR (parts_cur_another_year%ROWCOUNT = 0);

sqlcmd := 'ALTER TABLE STATUS_REPO DROP PARTITION ' || parts_record.partition_name;

EXECUTE IMMEDIATE sqlcmd;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(sqlerrm);
END;

END LOOP;

COMMIT;

CLOSE parts_cur_another_year;

END LOOP;

END IF;

-- Verifica se existe a particao DD+30, caso não, cria
FOR i IN instances_pa.FIRST..instances_pa.LAST
LOOP

mmddref := TO_CHAR(SYSDATE+30,'MMDD');

SELECT COUNT(*) INTO num_rows FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'STATUS_REPO' AND PARTITION_NAME = '' || instances_pa(i) || mmddref || '' ORDER BY PARTITION_NAME ASC; --Armazena o resultado na variável num_rows

IF num_rows &amp;lt;= 0 THEN

sqlcmd := 'ALTER TABLE ''STATUS_REPO'' add PARTITION ' || instances_pa(i) || mmddref || ' VALUES ('''|| instances_pa(i) || mmddref ||''') ' || 'TABLESPACE ABCD PCTFREE 1 PCTUSED 99 INITRANS 1 MAXTRANS 2 STORAGE (INITIAL 1048576 NEXT 1064960 PCTINCREASE 0 MINEXTENTS 1 MAXEXTENTS 2147483645 )'; --Cria uma nova partição

EXECUTE IMMEDIATE sqlcmd;

COMMIT;

END IF;

END LOOP;

END;

Shell script e SQLPlus

Deixe um comentário

É bem comum para quem trabalha com Unix ou Linux fazer script para executar um select em banco de dados – no nosso caso utilizaremos o Oracle via SQLPlus – e salvar o resultado em aquivo texto.

Segue um exemplo:

DATAREF=$1
ORACLE_SID=BD1
ORA_USER=USER_A

if [ -z $1 ]; then
 sqlplus $ORA_USER@$ORACLE_SID @sqlF.sql < .db.${ORA_USER}.${ORACLE_SID}.pwd 1>/dev/null
else
 sqlplus $ORA_USER@$ORACLE_SID @sql.sql $DATAREF < .db.${ORA_USER}.${ORACLE_SID}.pwd 1>/dev/null
fi   

tr -d ' ' < /home/User/tmp.txt > /home/User/out.txt
rm /home/User/tmp.txt

Explicação:

Primeiramente são inicializadas as variáveis, nesse caso DATAREF recebe o primeiro parâmetro informado na execução, as outras variáveis armazenam o nome do usuário e do banco.
Temos dois comportamentos diferentes caso a chamada do script tenha ou não a data informada como parâmetro, para isso o if com “-z” verifica se é nulo ou o tamanho é igual a zero.
Em seguida é feita a conexão com o BD via SQLPlus, para isso é passado o usuário@nome-do-banco, o script SQL que será executado é o @sqlF.sql seguido do arquivo que contém a senha para conexão, perceba que a senha é gravada em um arquivo oculto (que inicia por “.”, .db.${ORA_USER}.${ORACLE_SID}.pwd). Para finalizar, é configurado para não mostrar o sysout “1>/dev/null“.
Ao final temos uma situação interessante, é preciso retirar todos os espaços em branco do arquivo, para isso o comandodo bash “tr” é perfeito!

Google no terminal

Deixe um comentário

Hoje fiquei extasiado ao ver uma das ideias mais interessantes e criativas que eu vi nos últimos tempos. Um desenvolvedor chamado Stefan Grothkopp criou uma interface do Google baseado em terminal.

O site se chama Goosh de “Google Shell”, ele é feito em javascprit e com ele é possível até ler o Gmail. Muito bom, vale a pena conferir!
É possível se logar usando a conta do Gmail e personalizar a língua, quantidade de respostas, realizar buscas em blogs, news, vídeos, etc. Cada busca é separada em um diretório, semelhante ao terminal.

guest@goosh.org:/web>

Existe o comando “set” que permite as customizações e o comando “help” para maiores detalhes.

Imprimir em pdf

Deixe um comentário

Todo mundo em algum momento precisa “imprimir” documentos em formato “.pdf”. Uma ferramenta bem interessante para isso é o doPDF, uma ferramenta livre, leve, simples e sem propagandas. Recomendo!

doPDF: http://www.dopdf.com/

Entradas mais Antigas

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.