Introdução ao GNU/Linux

GNU/Linux

O GNU/Linux é um sistema operacional livre baseado no sistema UNIX, foi construído com a colaboração de pessoas do mundo todo e é disponível sob a Licença Pública Geral GNU (assim como a Wikipédia).

Sistemas operacionais baseados em UNIX® são sistemas multiusuários e são amplamente utilizados como Servidores e Estações de Trabalho pois possuem ferramentas poderosas para o controle e gerenciamento do sistema e também manipulação de arquivos.

Guia básico do sistema

Uma das grandes vantagens de usar o GNU/Linux, é a gama de ferramentas nativas do sistema, a maioria delas herdada do sistema UNIX®. Se pode fazer praticamente tudo através de comandos simples ou de rotinas (scripts). Tarefas repetitivas e/ou complexas podem ser realizadas e automatizadas através destas rotinas. Estas rotinas são geralmente executadas manualmente por um terminal do sistema ou agendadas para ser executadas automaticamente num determinado horário.

Algumas das questões que surgem quando abrimos um Terminal

terminal.png

: Quem somos, Onde estamos, Para onde vamos e Qual é o sentido da vida? Bom, o terminal nos dá a resposta pelo menos para as três primeiras questões com os comandos whoami (Who am I?) , pwd (Print Working Directory) e cd (Change Directory):

guilherme@kolmogorov:~$ whoami
guilherme
guilherme@kolmogorov:~$ pwd
/home/guilherme
guilherme@kolmogorov:~$ cd Artigos
guilherme@kolmogorov:~$ pwd
/home/guilherme/Artigos
guilherme@kolmogorov:~$ cd .. 
guilherme@kolmogorov:~$ pwd
/home/guilherme

Como vemos, a estrutura de diretórios se apresenta delimitada por uma barra / que indica a hierarquia dos diretórios. O diretório raíz (root) é a própria barra /. Para saber quais arquivos e diretórios se encontram no diretório atual de trabalho, usa-se o comando ls (List). Ao Digitarmos ls *.txt no terminal, são exibidos todos os arquivos cujos últimos quatro caracteres são .txt, digitando ls beatles*.mp3 são exibidos todos os aquivos que começam com beatles e terminam com .mp3 e assim por diante.

O comando mkdir (Make Directory) cria um novo diretório, por exemplo,

guilherme@kolmogorov:~$ mkdir Dados
guilherme@kolmogorov:~$ cd dados
-bash: cd: dados: No such file or directory
guilherme@kolmogorov:~$ cd Dados
guilherme@kolmogorov:~$ pwd
/home/guilherme/Dados

ah, é sensível à letras maiúsculas, minúsculas e acentos etc. Para copiar arquivos é simples, a sintaxe é cp <arquivo_origem> <arquivo_destino> caso estejam na mesma pasta, senão colocamos o caminho dos arquivos

guilherme@kolmogorov:~$ cp /home/guilherme/Calice.mp3 /mnt/sda4/musicas/MPB/

Para copiar todos os arquivos de uma determinada pasta para o atual diretório de trabalho pode-se fazer da seguinte forma

guilherme@kolmogorov:~$ cp -r /mnt/sda4/trabalho/*  .

O atributo -r refere-se a recursividade, o seja, copia todos os arquivos e diretórios dentro da /mnt/sda4/trabalho/ para o diretório de trabalho que está indicado pelo ponto. Da mesma maneira funciona o comando mv (move) que também pode ser usado para renomear arquivos (caso o <arquivo_origem> e o <arquivo_destino> estejam no mesmo diretório).

guilherme@kolmogorov:~$ cd  /mnt/sda4/musicas/MPB/
guilherme@kolmogorov:~$ mv Calice.mp3 Chico_Buarque-Calice.mp3

Mais informações sobre um determinado comando ou atributos dos comandos podem ser acessados pelo comando man (Manual)

guilherme@kolmogorov:~$ man cp
CP(1)                                     User Commands                           

NAME
       cp - copy files and directories

SYNOPSIS
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...

DESCRIPTION
       Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

       Mandatory arguments to long options are mandatory for short options too.

       -a, --archive
              same as -dpPR

       --backup[=CONTROL]
              make a backup of each existing destination file
lines 1-22

para navegar use as setas para baixo e para cima e para sair aperte a tecla Q.

Programando em Shell Script:

Mas por que digitar se eu posso fazer tudo clicando?

É claro que nenhuma dessas tarefas simples como criar diretórios, navegar entre diretórios e visualizar aquivos necessariamente precisa ser feita pelo terminal. Pode-se fazer usando o Ambiente Gráfico clicando aqui e ali como usualmente se faz. A questão que queremos abordar aqui é que, com ajuda do terminal, pode-se realizar tarefas repetitivas, complicadas e sujeitas a erros de maneira simples e rápida.

Podemos escrever uma determinada sequência de comandos e salvá-las dentro de um arquivo, e depois executá-las através de um interpretador chamado Shell. Essa rotina é geralmente chamada de script, neste caso de Shell Script. Além disso, podemos usar variáveis como qualquer outra linguagem de programação, vejamos dois exemplos simples:

guilherme@kolmogorov:~$ eu=$USER
guilherme@kolmogorov:~$ pasta=$(pwd)
guilherme@kolmogorov:~$ data=($(date))
guilherme@kolmogorov:~$ pasta=$(pwd)
guilherme@kolmogorov:~$  echo "Olá, eu sou o" $eu"."
Olá, eu sou o guilherme.
guilherme@kolmogorov:~$  echo "Eu estou no diretório" $pasta
Eu estou no diretório /home/guilherme
guilherme@kolmogorov:~$  echo "Agora são "${data[3]} "horas" 
Agora são 16:36:33 horas 
guilherme@kolmogorov:~$  echo "Hoje é dia" ${data[2]} "do mês" ${data[1]} "de" ${data[5]}
Hoje é dia 29 do mês Maio de 2008

Note que para acessar o valor de uma variável usa-se o símbolo $ junto à variável, e a variável USER não foi definida porque ela é uma variável do sistema. E agora um exemplo de como usar um laço.

guilherme@kolmogorov:~$ for i in 10 9 8 7 6 5 4 3 2 1 0; do echo $i; done
10
9
8
7
6
5
4
3
2
1
0
guilherme@kolmogorov:~$
[guilherme@kolmogorov ~]$ for pasta in $(ls -d */);do echo $pasta; done
amsn_received/
Desktop/
trabalho/

Exemplo 1

Por exemplo, vamos supor que temos que numa pasta, digamos na pasta /home/guilherme/dados, temos 99 arquivos para cada letra do alfabeto, para cada mês do ano e do ano 2001 até o ano 2007. Ou seja, 26 letras x 7 anos x 12 meses x 99 arquivos = 216216 arquivos. A nossa tarefa é separar os 99 arquivos em pastas correspondentes organizadas da seguinte forma: uma pasta para cada ano, dentro de cada ano uma pasta para cada mês e dentro de cada mês uma pasta para cada tipo. Ou seja, devemos criar 2184 pastas e copiar os 99 arquivos correspondentes para cada uma delas. Isso pode ser bastante torduoso, repetitivo e sujeito a erros. Para nossa sorte a nomenclatura segue uma ordem: <tipo>_<ano>_<mês>-<numeração> .txt.

Por exemplo, o comando ls a*1*jan_3* dentro da pasta de trabalho exibe

guilherme@kolmogorov:~$ ls a*1*jan_3*
a_2001_jan_30.txt a_2001_jan_31.txt a_2001_jan_32.txt a_2001_jan_32.txt 
a_2001_jan_33.txt a_2001_jan_34.txt a_2001_jan_35.txt a_2001_jan_36.txt
a_2001_jan_37.txt a_2001_jan_38.txt a_2001_jan_39.txt

O uso de seqüências pode ser muito útil na nomeação e de arquivos ou pastas, a seguir alguns exemplos :

guilherme@kolmogorov:~$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
guilherme@kolmogorov:~$ echo {2005..1999}
2005 2004 2003 2002 2001 2000 1999
guilherme@kolmogorov:~$ echo {a..h}
a b c d e f g h
guilherme@kolmogorov:~$ echo {A..D}{a..d}
Aa Ab Ac Ad Ba Bb Bc Bd Ca Cb Cc Cd Da Db Dc Dd

Comandos básicos

pwd

Informa o atual diretório de trabalho. Por exemplo

$pwd
/home/guilherme

whoami

Informa a identidade do usuário

ls

Lista os arquivos e diretórios do atual diretório de trabalho

mkdir

Cria um novo diretório:

$mkdir nova_pasta

Alguns Comandos úteis

split

O comando split é usado para dividir determinado arquivo em pedaços menores, muito útil quando se tem dois disquetes e um arquivo de 2 Mb,por exemplo. Dividi-se o treco em dois pedaços de 1 Mb e manda pro baú.

Você tem duas opções ao dividir um arquivo: por número de linhas ounúmero de bytes. Para dividir por número de linhas, use a seguinte sintaxe:

$split --lines=1000 arquivo.txt

Isso irá gerar N arquivos com 1000 linhas cada. Se optar pelaquantidade de bytes, use:

$split --bytes=1073741824 backup.tar.gz

Que irá gerar N arquivos com 1 Mb cada.

chmod

O comando chmod muda as permissões de arquivos e pastas. Ele tem a flexibilidade de trabalhar com valores decimais de 0 a 7. Cada valor tem uma combinação de permissões pelos 3 grupos de caracteres:

0 : (nenhuma permissão)
1 : (somente execução)
2 : (somente escrita)
3 : (escrita e execução)
4 : (somente leitura)
5 : (leitura e execução)
6 : (leitura e escrita)
7 : (leitura, escrita e execução)

Utilitários de ompactação e descompactação

Para descompactar estes formatos de arquivos, os comandos são simples:

gzip:

gunzip nomedoarquivo

rar:

rar x nomedoarquivo

tar.gz:

tar -vzxf nomedoarquivo

tar.bz2:

tar -vxjpf nomedoarquivo

Gravar CD/DVD por linha de comando

Criar uma imagem .iso

$mkisofs -r -J -o nome_do_arquivo.iso /diretorio_de_origem/

Onde:

  • mkisofs: é o comando que chama o programa.
  • -r: permite que qualquer cliente possa ler o conteúdo do arquivo. Evita problemas ao tentar ler o arquivo no Windows.
  • -J: mais uma opção para manter compatibilidade como Windows. Ativa as extensões Joilet.
  • -o: especifica o nome do arquivo ISO que será criado.
  • nome_do_arquivo.iso: o nome do arquivo propriamente dito. Não se esqueça de sempre incluir a extensão .iso. O arquivo é sempre gravado no diretório corrente.
    • /diretório_de_origem/: o diretório onde estão os arquivos que serão incluídos na imagem. Você pode especificar vários diretórios separados por espaços, como em: /home/morimoto/livros/ /home/morimoto/Mail/.

Para reconhecer onde esta o CD

$cdrecord -scanbus dev=/dev/hdd

Para gravar a imagem de CD

$cdrecord -v -fs=16M speed=8 dev=0,0,0 -data nome_da_imagem.iso

Para apagar

$cdrecord dev=/dev/hdd:1,1,0 speed=4k blank=fast

Para gravar uma imagem de DVD

$growisofs -dvd-compat -Z /dev/cdrom=nova_da_imagem.iso

Wget

geral:

wget http://www.qualquercoisa,com,br

recursivamente

wget -r

continuar

wget -c

não copiar os diretórios pais

wget -np

copiar um determinado tipo de arquivo

wget -A ".jpg"

ImageMagik (convert)

AWK

Shell Scripts Úteis

Converter arquivo texto ISO8859_1 em UTF8

ls *.tex  | \
while read arq
do
    echo $arq

    iconv --from-code=ISO-8859-1 --to-code=UTF-8 $arq  > foo
    mv foo $arq
done

Cuidado Rodar o script uma única vez!

Converter um formato de Vídeo em outro

#!\bin\bash
## convert_video.sh
mencoder -oac mp3lame -lameopts cbr:br=64:vol=2 -srate 22050 -ovc xvid -sws 1 -xvidencopts bitrate=500:max_key_interval=120:vhq=4 -ofps 30 -vf scale=640:360  $1 -o $2

por exemplo

./convert_video.sh filme.rmvb filme.avi

Backup Arquivos e pastas

#!/bin/bash
PWD=($(pwd))
cd $PWD
data=($(date +%Y%b%d_%H%M))
file=${1%/} 
tar cvzf $file"_"$data".tar.gz" $file
cd -
Unless otherwise stated, the content of this page is licensed under GNU Free Documentation License.