Pages

Showing posts with label dotfiles. Show all posts
Showing posts with label dotfiles. Show all posts

Sunday, October 28, 2012

Compactando arquivos no terminal do GNU/Linux

Há quase dois anos eu me dediquei a modificar uma função de descompactação de arquivos comumente encontrada na internet para uma um pouco mais geral, que me permitisse descompactar em um único comando vários arquivos e que também podem ter formatos diferentes. Você pode encontrar essa função nesse texto.

Hoje, eu criei a função inversa. A que me permite fazer compactação de arquivos sem ter que pensar muito em qual comando tenho que digitar. A função segue abaixo.
   compact() {
     if [ "$#" -ge "1" ]; then
        case "$1" in
          *.[tT][aA][rR].[bB][zZ]|*.[tT][bB][zZ])
                  local file="$1"; shift; tar jcvf "$file" "$@" ;;
          *.[tT][aA][rR].[bB][zZ]2|*.[tT][bB][zZ]2)
                   local file="$1"; shift; tar jcvf "$file" "$@" ;;
          *.[tT][aA][rR].[gG][zZ]|*.[tT][gG][zZ]) 
                   local file="$1"; shift; tar zcvf "$file" "$@" ;;
          *.[gG][tT][gG][zZ]) 
                   local file="$1"; shift; tar zcvf "$file" "$@" ;;
          *[bB][zZ]2)                           
                   shift; bzip2 -z -k "$@"  ;;
          *.[rR][aA][rR])
                    local file="$1"; shift; rar a -r "$file"  "$@" ;;
          *[gG][zZ])                           
                     shift; gzip -r "$@"  ;;
          *.[tT][aA][rR]) 
                     local file="$1"; shift; tar cvf "$file" "$@" ;;
          *.[zZ][iI][pP])
                     local file="$1"; shift; zip -r "$file" "$@" ;;
          *.7[zZ])
                     local file="$1"; shift; 7z a -r "$file" "$@" ;;
          *.[xX][zZ]) 
                     local file="$1"; shift; tar Jcvf "$file" "$@" ;;
          *)    echo "don't know how to compact '$i' ..." ;;
        esac
      else
        echo "Insufficient arguments."
      fi ; }
Novamente, para usar a função basta copiar esse texto e adicioná-la no seu ~/.bashrc O uso dessa função é bastante simples. Basta, no terminal, digitar:

compact arquivo_compactado.EXTENSÃO lista de arquivos para compactar

Onde, arquivo_compactado.EXTENSÃO é no nome do arquivo final (quando aplicável -- eu chego lá para explicar isso) seguido de sua extensão. Exemplos.: arquivo.tar.bz2, arquivo.tgz, arquivo.zip, arquivo.rar ...

 Esta regra NÃO é aplicável no caso de compactação direta no forma .gz ou .bz2. Nesse caso comando compacta o próprio arquivo no local dele, ou seja, o arquivo chamado zezinho.txt, torna-se zezinho.txt.gz ou zezinho.txt.bz2. Por esse motivo, o nome do arquivo compactado não faz sentido aqui e o comando fica sendo:

compact EXTENSÃO lista de arquivos para compactar

Onde extensão indica o tipo de compactação, nesse caso, apenas com bz2 e gz isso faz sentido.
A lista de arquivos aceita espaço no nome dos arquivos e permite recursividade emdiretórios em todos os formatos, exceto, o bzip2. Sendo que alerto que no caso da compactação com o gz isso irá criar 'n' arquivos de formato .gz e não apenas 1 único arquivo final. Se quer compactar com o .gz e ter apenas um arquivo no final, na verdade, mesmo sem saber, está querendo usar o .tar.gz. O mesmo se aplica para o caso do bzip2, mas eu não consegui fazer ele tratar recursividade em diretórios.

Limitações
Há algumas limitações. A primeira delas é que existem vários níveis de compressão, várias opções que não foram escritas. Exemplo, é possível compactar arquivos com o zip usando criptografia, basta, para isso, adicionar a opção 'e' no comando. Eu não fiz isso, logo, esse comando não permite ao usuário compactar com criptografia. Da mesma forma, os níveis de compactação estão no nível padrão para todos os formatos.

Quem já abriu a manpage de qualquer um desses programas sabe que eles fazem muito mais do que o que foi escrito acima, mas eu nunca usei nenhum das opções adicionais para compactação, assim, quando escrevi o básico, escrevi algo que funcionará muito bem para mim.

Alerto para o uso da compactação com o gzip e o bzip2. Se nunca usou esse tipo de compactação pura, antes de fazer qualquer coisa nos seus arquivos de trabalho, faça testes, verifique o resultado e procure entender o que acontece. Não use esses comandos sem entendê-los antes. 

Convite
Enquanto escrevia a função, ficava claro para mim que há muito espaço para aprimoramentos. Fiz o melhor que pude hoje, mas convido a todos que se interessarem a contribuírem com a melhoria da função.

Sunday, September 11, 2011

Scripts: urldecode e urldecodefilemv


Funções para renomear em lote arquivos com a notação: "Hoje%20%C3%89%20Dez.pdf"
Esse nome, caso não tenha percebido, devia ser "Hoje É Dez.pdf".
Renomear isso uma vez é fácil, dezenas de vezes, não é.

Depois de muita pesquisa (tá achando o que ? Que eu fiz isso sozinho ???), descobri como fazer isso sem grande esforço.
As duas funções abaixam trabalham em conjunto, mas a primeira independente da segunda (o inverso não é verdadeiro)

Como eu coloquei as funções no meu .bashrc, a rigor, o uso é

urldecodefilemv nome_do_arquivo_problemático

para renomear um único arquivo problemático, ou

urldecodefilemv *

para renomear todos os arquivos problemáticos.

Quem quiser colocar as funções em um script, pode, mas no caso, o modelo mais simples de organização seria colocar o conteúdo de cada função em um script, as outras n formas de combinar a informação fica por conta de cada um. Segue as funções.

urldecode() {
 arg="$1"
 i="0"
 while [ "$i" -lt ${#arg} ]; do
 c0=${arg:$i:1}
if [ "x$c0" = "x%" ]; then
c1=${arg:$((i+1)):1}
c2=${arg:$((i+2)):1}
printf "\x$c1$c2"
i=$((i+3))
else
echo -n "$c0"
i=$((i+1))
fi
 done
}


urldecodefilemv(){
 for i in "$@";  do 
   if [ -f "$i" ]; then
result=$(urldecode "$i")
if [ "$i" != "$result" ]; then
      mv "$i" "$result" 
fi
fi
 done
}

Wednesday, June 15, 2011

SSH: listando os ataques sofridos

[update] Acho que eu estava dormindo quando escrevi esse texto. Deixei-o incompleto. Para que a informação não falte, estou atualizando-o. [/update]

Não são raras as vezes que eu tenho que averiguar as tentativas de invasão por ssh que os computadores que estão sob minha responsabilidade sofrem (para dizer a verdade, lista as tentativas de acesso inválidas). Recentemente resolvi colocar uma função no meu .bashrc (já devia te feito isso antes) e publicar aqui. A função é a seguinte:
logssh() { sudo grep sshd $1 |grep Invalid| sed "s/^.*.from //g"|sort |uniq -c|sort -nr;  }
Claro que ela foi escrita para computadores que possuem o sudo habilitado. De outra forma, acrescente o a mesma linha no .bashrc do root sem o comando sudo.

Para usar o comando, faça :
logssh /caminho/para/o/log/que/contem/a/informação/desejada
O grande porém desse comando é saber qual é o arquivo que contém a informação desejada.

Então, meu conhecimento me diz que no Arch Linux o arquivo é o /var/log/auth.log, no Scientific Linux 6, o arquivo é o /var/log/secure, e eu o conteúdo dessa informação registrado em  /var/log/messages, em /var/log/messages.log, em /var/log/auth (sem a extensão .log) e outros. Pode parecer incrível, mas cada vez que eu abro um sabor de GNU/Linux diferente eu dou uma olhada no conteúdos dos arquivos em /var/log para saber o que cada arquivo está registrando.

[update] Me lembrei agora que dependendo da versão do ssh, o comando pode necessitar de alguns ajustes no comando grep [/update]

Tuesday, November 23, 2010

Descompactando arquivos no terminal do GNU/Linux

Não sei que foi a primeira pessoa a escrever a função extract transcrita abaixo do Wiki do Arch Linux (no momento, no final da página), mas que na verdade eu recebi de um amigo que a usa o tempo todo.
extract () {
   if [ -f $1 ] ; then
       case $1 in
           *.tar.bz2)   tar xvjf $1    ;;
           *.tar.gz)    tar xvzf $1    ;;
           *.bz2)       bunzip2 $1     ;;
           *.rar)       rar x $1       ;;
           *.gz)        gunzip $1      ;;
           *.tar)       tar xvf $1     ;;
           *.tbz2)      tar xvjf $1    ;;
           *.tgz)       tar xvzf $1    ;;
           *.zip)       unzip $1       ;;
           *.Z)         uncompress $1  ;;
           *.7z)        7z x $1        ;;
           *)           echo "don't know how to extract '$1'..." ;;
       esac
   else
       echo "'$1' is not a valid file!"
   fi
 }

A verdade é que achei essa função um pouco inconveniente. O arquivo não pode ter espaço no nome, trata apenas um arquivo por cada chamada de função e a estrutura não identifica o arquivo caso ele tenha nome com letras maiúsculas (tipo, arquivo *.ZIP).

Assim, fiz algumas modificações e esta está abaixo:
extract() { 
         for i in "$@";  do 
           if [ -f "$i" ]; then
          case "$i" in
              *.[tT][aA][rR].[bB][zZ]|*.[tT][bB][zZ])   tar xjvf "$i" ;; 
              *.[tT][aA][rR].[bB][zZ]2|*.[tT][bB][zZ]2) tar xjvf "$i" ;; 
              *.[tT][aA][rR].[gG][zZ]|*.[tT][gG][zZ])   tar xzvf "$i" ;;
              *.[gG][tT][gG][zZ])                       tar xzvf "$i" ;;
              *.[bB][zZ]2)                              bunzip2 "$i" ;;
              *.[rR][aA][rR])                           rar x -o+ "$i" ;;
              *.[gG][zZ])                               gunzip "$i" ;;
              *.[tT][aA][rR])                           tar xvf "$i" ;;
              *.[zZ][iI][pP])                           unzip -o "$i" ;;
              *.Z)                                      uncompress "$i" ;;
              *.7[zZ])                                  7z x "$i" ;;
              *)    echo "don't know how to extract '$i' ..." ;;
          esac
           else 
             echo "$i is not a valid file"
           fi
         done 
   }

Essa função aceita tantos argumentos quando o bash suporte e identifica a maioria dos problemas de maiúsculas e minúsculas. Além de não apresentar problemas ao manipular arquivos com espaços no nome.

Para usá-la, basta adicionar a mesma no arquivo ~/.bashrc...

Quem tiver sugestões para aprimorar essa função, pode deixar um "oi" pelo comentários...

Thursday, June 04, 2009

Nova forma de disponibilizar scripts e arquivos de configuração

Eu perdi a paciência com o Snipt mais rápido do que eu podia imaginar.

Assim, na busca de um lugar que pudesse aceitar os meus pequenos arquivos de configuração e scripts, eu me optei pelo Google Sites.

O Google Sites está muito melhor que o falecido Google Pages e conta com um número muito bom de recursos, inclusive, com formas específicas para compartilhar artigos que o tornam muito próximos de um "Google Drive" (vide template "File Cabinet"). A disponibilidade de 100 MB é muito mais do que eu preciso para compartilhar arquivos de configuração...

A escolha natural do Google Sites dá-se depois de pensar em como transferir os arquivos que eu compartilho via Google Pages (que com o fim deste, serão automaticamente transferidos para o Google Sites).

Bom, os três arquivos compartilhados recentemente nesse blog, o ~/.vimrc, o Makefile para LaTeX e o latexfilter, foram atualizados para a última versão e transferidos para o Google Sites. Note no fim de cada uma dessas páginas a existência do arquivo anexado.

Todos os arquivos de configuração e scripts disponibilizados aqui estão disponíveis na barra lateral do blog. E serão atualizados silenciosamente quando tiverem apenas algumas pequenas correções...

Não tenho certeza de que vou atualizar os links nos tópicos oficiais, o mais provável é que fique como está...

Nota: Para gerar essas páginas bonitinhas, abra o arquivo vim, selecione o esquema de cores de sua preferência e digite no modo de comando:
   :so $VIMRUNTIME/syntax/2html.vim 
No meu .vimrc, existe um mapeamento que correlaciona o \2html em modo normal com esse comando acima. O gvim exibe em "Editar" > "Esquema de cores" todos os esquemas de cores que possui instalado.