Como copiar arquivos recursivamente no linux (no terminal)

Você provavelmente veio parar aqui por que usou um comando semelhante a este:
cp -r /origem/*.mp3 /destino/
e não funcionou.
Há várias formas de fazer isto, com arquivos de qualquer extensão (*.mp3, *.jpg, *.txt etc.). Como você já sabe, cp -r não é uma delas.

Como copiar arquivos recursivamente com os comandos find e cpio

Estes comandos dão conta do recado. O primeiro encontra os arquivos do tipo desejado, recursivamente. O outro faz a cópia, mantendo a estrutura de diretórios.
Adapte a linha de comando, que segue, para que ela atenda às suas necessidades.
$ find /caminho/de/origem/ -name ‘*.mp3’ | cpio -pdm /caminho/de/destino/

LEIA MAIS

Veja o que as opções ‘-pdm’ fazem:

  • -p habilita a operação de cópia recursiva
  • -d cria a estrutura de diretórios no destino, de acordo com a original
  • -m preserva as datas de modificação dos arquivos

O comando grep

O grep pode ser visto como uma forma simplificada de consulta a um banco de dados em texto puro, em que cada linha representa um registro.
O utilitário pode ser usado para retirar um conjunto de strings (cadeias de caracteres) do resultado de um comando dado ou de um arquivo texto, por mais longo que seja.
Este artigo reúne uma coletânea de exemplos, que irão ajudar a entender bem o funcionamento do grep.

LEIA MAIS:

Use a caixa de busca para descobrir outros artigos que fazem uso de exemplos com o comando grep.

Exemplo básico de uso do comando grep

Para pedir uma lista dos processos em execução na máquina, podemos usar o comando ‘ps aux’.
Mas a lista pode ser muito extensa e você só quer saber (por exemplo) do ‘NetworkManager’:


ps aux | grep -i net

Observe que ele exibe e destaca todas as strings contendo a cadeia de caracteres “net” (veja a imagem, abaixo).
Captura de tela de 2013-02-22 13:42:27
Entenda o que foi feito:

  • O comando ps aux exibe todos os processos em execução.
  • O operador | redireciona os resultados do comando ps para o grep, que filtra as ocorrências de “net” do resultado.
  • O parâmetro -i, pede ao programa que ignore se as letras estão em maiúsculas/minúsculas.

Use o grep para filtrar resultados de arquivos de log do sistema

Certos arquivos de log do sistema são muito extensos e podem conter uma quantidade imensurável de informações irrelevantes pra sua situação.
O grep pode ajudar a encontrar “uma agulha no palheiro”.
Vejamos, como exemplo o arquivo de log /var/log/dmesg que contém informações atuais do que está ocorrendo no seu sistema.
Vamos visualizar seu conteúdo – deixando de fora tudo o que não se refere à nossa interface de rede eth0:


cat /var/log/dmesg | grep eth0

Captura de tela de 2013-02-22 14:09:19

Use o egrep para filtrar resultados com operadores lógicos

Outros comandos, como lshw, também retornam uma lista muito extensa e podem demorar muito para finalizar.
O interessante, aqui, é direcionar o resultado do comando para um arquivo texto, que será usado com muito mais facilidade.
Com o seguinte comando, você cria o arquivo lshw.log contendo o resultado do lshw:


sudo lshw > lshw.log

Este procedimento traz as vantagens de não precisar mais invocar o sudo, para obter o resultado do lshw e a velocidade com que o sistema lê e exibe o texto do lshw.log.
A seguir vamos usar uma versão diferente do grep, o egrep, para filtrar os resultados que se referem às nossas interfaces de rede eth0 e wlan0:


egrep -C 2 -i '(eth|wlan)0' lshw.log

Olha a explicação do comando acima:

  • -C 2 — inclui as 2 linhas acima e as 2 linhas abaixo daquela em que foi encontrada a string desejada.
    Assim você sabe em que contexto o resultado está inserido.
  • -i — desativa a sensibilidade às ‘caixas’, ou seja, tanto faz se os caracteres estiverem em minúsculas ou maiúsculas.
  • o operador lógico | ou pipe — Desde que a string termine com ‘0’, tanto faz que seja ‘eth0’ ou ‘wlan0’.
    Assim, ficam incluídos os resultados referentes à interface de rede a cabo e sem fio.

Captura de tela de 2013-02-22 14:34:04

LEIA MAIS:

Como encontrar arquivos com o comando grep

Você pode usar o utilitário também para encontrar arquivos de texto pelo seu conteúdo.
Para pesquisar recursivamente no diretório atual por arquivos que contenham a palavra “firefox”, use-o da seguinte forma:


grep -iR 'firefox' *.conf

comando grep para encontrar arquivos por conteúdo

Conclusão

Como dicas finais, ao fazer a pesquisa dentro de arquivos grandes, gosto de usar os parâmetros ‘-n’ e ‘--color‘.
O primeiro numera as linhas, tornando mais fácil, ao abrir o arquivo, encontrar algo que eu desejo alterar.
O segundo mostra a saída do comando em cores, o que também ajuda a discernir melhor os resultados.
Você pode obter mais informações sobre o comando ao executar o seu manual:


man grep

Divirta-se!

Altere as cores dos nomes dos diretórios, no terminal

Esta não é uma dica que exija algum conhecimento avançado de Linux, embora seja voltado para quem usa o terminal para executar alguns comandos — especialmente se for pra ver os conteúdos dos diretórios.
O problema aqui é que os nomes dos diretórios, quando coloridos, costumam vir em azul escuro – o que é ótimo para quem usa um terminal, como o xterm, com o fundo branco.
Mas atrapalha a visibilidade para quem usa um tema de fundo escuro no console.
No Ubuntu, o aplicativo de terminal padrão tem fundo preto, o que dificulta a leitura de letras azul escuro ou, azul com fundo verde (o que depende das permissões destes diretórios).
Captura de tela de 2013-02-07 22:31:10
Neste post vou mostrar como alterar a cor das letras dos nomes dos diretórios para amarelo claro — mas você pode experimentar e optar por outras colorações.
Readéque os exemplos à sua preferência.

  1. Abra o arquivo ~/.bashrc com o seu editor favorito
  2. Inclua ao final do arquivo o seguinte código:
    LS_COLORS='di=1;33';export LS_COLORS
    # altera a cor de exibição dos nomes de diretórios para amarelo forte.

Caso você não goste muito desta opção de cor (1;33), há outras, como você pode ver abaixo.

  • Azul = 34
  • Verde = 32
  • Verde Claro = 1;32
  • Ciano = 36 — usada para exibição de links
  • Vermelho = 31
  • Púrpura = 35
  • Marrom = 33
  • Amarelo = 1;33
  • Branco = 1;37
  • Cinza Claro = 0;37
  • Preto = 30
  • Cinza escuro = 1;30

O primeiro número determina a intensidade ou a variação da cor:

  • 0 — nenhuma
  • 1 — negrito
  • 2 — normal
  • 3 — clareado
  • 4 — sublinhado

O valor após o ponto e vírgula (;) determina a cor a ser usada.
Depois de feitas, as alterações só terão efeito depois de reiniciar a sessão.

Como ver as alterações no console sem reiniciar a sessão

Vamos simplificar as coisas a ponto de bastar iniciar um novo terminal (Ctrl+Alt+T) para ver as alterações.
Para isto, é necessário incluir a linha if [ -f ~/.bashrc ]; then . ~/.bashrc; fi no arquivo .bash_profile:

echo "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >> ~/.bash_profile
# Este codigo pode ser removido quando os ajustes de lscolors estiverem finalizados.

Leia mais sobre o LS_COLORS aqui.
Toda vez que você abrir um novo terminal (ou shell), o .bash_profile, presente no seu diretório home, é executado. A linha, que incluímos força a leitura adicional do arquivo de configuração .bashrc seja lido.

Como encriptar um Shell Script com SHC

Neste texto, vou ensinar a baixar, instalar e usar SHC, um programa que encripta o código do seus shell scritps.
Antes de mais nada, eu gostaria de dizer que encriptar seus códigos não é uma prática recomendável. O ideal é documentar todo o script, de forma que qualquer pessoa o possa entender facilmente. Códigos fonte devem ser o mais acessíveis possível – já a informação com a qual eles lidam, é que deve ser restringida.
Se você precisa usar informações, usualmente confidenciais, como senhas, de forma automática, então deve procurar outra solução.
Hmmmm… você ainda está aqui?
Tenha em mente, contudo, que um script codificado através do SHC pode não ser legível para usuários comuns (creio que este seja o seu objetivo) — Contudo, uma pessoa que tenha conhecimento do seu funcionamento pode extrair o código criado pelo software.
Em tempo, SHC quer dizer SHell script Compiler.

Download e instalação

O software de que vamos tratar aqui, foi desenvolvido por Francisco Javier R. Garcia e você vai encontrar sua versão mais atualizada aqui.
Vamos começar com o download do código fonte do programa:

wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz

Uma vez baixado, desempacote e instale:

tar xvfz shc-3.8.9.tgz
cd shc-3.8.9
make

Verifique se tudo correu bem:

./shc -v
shc parse(-f): No source file specified
shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-rvDTCAh] -f script

Crie um shell script de exemplo

Para testar, você pode usar seu próprio shell script ou pegar este aqui:

#!/bin/bash
echo -n "Quantos numeros aleatorios voce deseja gerar? "
read max
for (( start = 1; start
do
echo -e $RANDOM
done

rode o script:

$ ./alea.sh
Quantos numeros aleatorios voce deseja gerar? 3
24682
1678
491

Encriptando o seu shell script com shc

Use o comando, a seguir, para fazer o trabalho:

./shc -f alea.sh

isto deverá gerar os seguintes arquivos:

ls -l alea*.*
-rwxrw-r--. 1 user group 149 Mar 27 01:09 alea.sh
-rwx-wx--x. 1 user group 11752 Mar 27 01:12 alea.sh.x
-rw-rw-r--. 1 user group 10174 Mar 27 01:12 alea.sh.x.c

Dos quais:

  • alea.sh é o seu script original
  • alea.sh.x é o seu script em formato binário e encriptado
  • alea.sh.x.c é o código fonte do script original em linguagem C

Após transformar o código do seu script, originalmente escrito em Bash para um script em C, o shc o compila, gerando o executável alea.sh.x.
Veja como testar:

$ file alea.sh
alea.sh: Bourne-Again shell script text executable
$ file alea.sh.x
alea.sh.x: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
$ file alea.sh.x.c
alea.sh.x.c: ASCII C program text

Execute o seu script encriptado

./alea.sh.x
Quantos numeros aleatorios voce deseja gerar? 3
7489
10494
29627

Determine uma data de expiração pro seu script

Com o uso do shc, é possível evitar que o seu script seja executado após uma certa data. Se for feita a tentativa de executar um script que já tenha expirado, uma mensagem de erro será exibida na tela.
Crie um novo script, usando a opção “shc -e“, que permite a entrada de uma data de expiração (que deve ser fornecida no formato dd/mm/yyyy:

./shc -e 31/12/2011 -f alea.sh

Veja o que acontece quando alguém tenta executar um script vencido:

./alea.sh.x
./alea.sh.x: has expired!
Please contact your provider

Você pode criar a sua própria mensagem de expiração, para o caso de redistribuir o seu script para pessoas que não falem inglês, por exemplo. Use a opção -m para isto.
Divirta-se!