CI066 - Oficina de Programação
Notas de Aula # 04

Prof. Armando Luiz N. Delgado

1 Manipulação de Arquivos e diretórios

1.1 Compactação de arquivos. Arquivamento e Backup

Referência básica: Capítulo 6, seção 6.4 da Apostila Linux Básico (1)

Compactadores
Arquivos de grande volume podem ser comprimidos e posteriomente recuperados para seu tamanho original com comandos de compressão. Em UNIX os principais comandos são:
Familia gzip(1):
Atualmente os comandos mais usados em UNIX.
Família bzip2(1):
Cada vez mais usados, oferecem um fator de compressão maior que o comando gzip(1).
Família zip(1):
Mesmo formato de compressão dos comandos da família winzip do ambiente Microsoft Windows.


Tabela 1: Famílias de Compactadores de Arquivos
Família Compactador Descompactador Visualizador Sufixos
gzip(1) gzip gunzip zcat .gz
bzip2(1) bzip2 bunzip2 bzcat .bz2
zip(1) zip unzip - .zip


Arquivadores (archivers):
usados para AGREGAR um conjunto de arquivos em um único (denominado achive). Muito utilizados para fazer cópias de segurança (Backup) de áreas de usuários ou de um conjunto de arquivos e diretórios.

ATENCAO: Nao confunda a operacao dos arquivadores com CONCATENACAO de arquivos, que eh feita por cat(1).

tar(1):
O mais usado em sistemas UNIX. Sintaxe totalmente própria do comando e seu formato é incompatível com outros arquivadores;

Muitas vezes, arquivos gerados com tar(1) são posteriormente compactados com gzip(1) ou bzip2(1). Isto é indicado pelos sufixos da Tabela 2


Tabela 2: Sufixos associados a arquivos tar compactados
Compactador Sufixo
gzip(1) .tar.gz, .tgz, .taz
bzip2(1) .tar.bz2, .tbz


zip(1):
Além de ser um compactador, o comando zip(1) é também um arquivador, já que na verdade este comando compacta um conjunto de arquivos e após a compactação de cada um, os coloca todos em um único arquivo.

split(1):
Usado para dividir um arquivo muito grande para que caiba em diversas mídias (disquete ou pendrive) de tamanho pequeno.

Exemplo: split --bytes=1400k bkp.tar.gz: desmembra o arquivo bkp.tar.gz em partes com tamanho máximo de 1400 Kbytes.

2 Strings e Quoting

Ao se digitar \enterao final de uma linha de comando, o shell primeiramente expande os metacaracteres que existirem na linha de comando e trata os redirecionamentos de Entrada e Saída (que serão vistos em aulas posteriores) ANTES de efetivamente providenciar a execução do comando.

Considere como exemplo que em seu diretório corrente existem os arquivos teste.txt, memorando.txt e prog1.c, e que você executa a linha de comando abaixo:

         ls -l *.txt *.[cp]
Quando o shell analisa a linha de comando, os metacaracteres são tratados e expandidos pelo shell ANTES de excecutar o comando, de forma que a linha de comando EFETIVAMENTE executada é:
         ls -l teste.txt memorando.txt prog1.c

Como outro exemplo, considere que o diretório ~/Aulas contém os arquivos assoc.c e atrib.doc, e também o sub-diretório autores e que você deseja executar o comando abaixo:

         find ~/Aulas -name a* -print
Ao analisar a linha de comando acima, o shell expande os metacaracteres, e a linha de comando EFETIVAMENTE executada é:
         find ~/Aulas -name atrib.doc assoc.c autores -print
Isto fará com que find(1) acuse um erro, pois para este comando assoc.c e autores não são argumentos da opção -name, mas diretórios por onde procurar arquivos. Isto porque no comando find(1), os diretórios por onde é feita a busca de arquivos devem vir SEMPRE ANTES de quaisquer opções do comando, sejam ações ou critérios de busca).

Assim, pode ser eventualmente necessário que se impeça o shell de expandir metacaracteres em uma linha de comando. Linhas de comando que envolvam find(1) e grep(1) são os casos mais comuns desta necessidade.

Quando o usuário NÃO deseja que estes metacaracteres sejam interpretados e substituídos pelo shell, os strings em que ocorrem devem ser delimitados por apóstrofes (´) ou por aspas (¨). A diferença entre usar aspas ou apóstrofes ficará mais clara quando for visto o conceito de VARIÁVEIS DE AMBIENTE. Por enquanto, recomenda-se o uso de aspas (¨).

Por este motivo, em comandos como find(1) e grep(1), os argumentos em que aparecem metacaracteres devem ser delimitados por apóstrofes ou aspas, com o risco de ocorrer erro na execução caso isto não seja cuidadosamente observado.

Uma outra forma de impedir a expansão de um metacaracter é precedê-lo por uma contra-barra ($\setminus$). Isto é muito comum quando se deseja criar ou acessar um arquivo cujo nome tem como parte integrante do nome metacaracteres ou caracteres especiais do shell (tais como * [] # () ? {}) ou mesmo espaço:

          cp teste.txt meu\ diario.txt
          ls \#\*
          rm "meu diario.txt"

De um modo geral, se um argumento qualquer de comando é um string que deva conter um espaço, metacaracter ou caracteres especiais, este argumento deve estar delimitado por aspas (preferencialmente) ou apóstrofes:

           cp prog1.p "Arquivos de Programas/prog_2.p"

Se aspas ou apótrofe devem constar em um string como tal, eles devem ser precedidos de contra-barra ($\backslash$):

           echo "Meu diretório de login é \"$HOME\"."

ATENÇÃO: $\textstyle \parbox{10cm}{Recomenda-se evitar o uso de
metacaracteres, espaço o...
...plo, copiar para um disco UNIX arquivos provenientes de ambiente
MS-Windows).}$

3 Configuração de área de trabalho

Referência básica: Capítulo 5 da Apostila Linux Básico (1)

3.1 Conceitos gerais

3.2 Variáveis de Ambiente

Referência básica: Seção 5.3 da Apostila Linux Básico (1)

 

Em qualquer shell (bash, sh, ksh, etc.) é possível definir VARIÁVEIS, da mesma forma que se define variáveis em programas. De um modo geral, estas variáveis são usadas pelo shell e por outros programas para configurar o ambiente do usuário e determinados comportamentos de programas.

Variáveis em shell são por definição nomes aos quais se associam valores. Para se definir uma variável em shell usa-se a seguinte sintaxe:

                <nome_variavel>=<valor>

Exemplos:

             EDITOR=emacs
             PRINTER="salaminho"
             PATH="/usr/bin:/bin:/usr/local/bin"
             LAB_DIR="~/LabNum2"

ATENÇÃO: não há ESPAÇOS EM BRANCO antes ou depois do sinal de atribuição =.

Por convenção, nomes de variáveis pré-definidas pelo shell e/ou usadas por outros programas são escritas sempre em maiúsculas.

Para recuperar ou referenciar o valor de uma variável em uma linha de comando, deve-se utilizar o símbolo $ antes do nome da variável:

ci066@dupond:~echo $EDITOR
emacs
ci066@dupond:~find $LAB_DIR -name '*-8'  -exec ls -l {} $\backslash$;
....
ci066@dupond:~VISUAL=$EDITOR

Para se remover a definição de uma variável usa-se o comando unset:

ci066@dupond:~echo $EDITOR
emacs
ci066@dupond:~unset EDITOR
ci066@dupond:~echo $EDITOR
 
ci066@dupond:~ 

Em shell, algumas variáveis de ambiente possuem um significado especial:

HOME
seu valor representa o diretório de login do usuário. Ao iniciar um shell, esta variável é AUTOMATICAMENTE definida e NÃO deve ter seu valor alterado pelo usuário;
MAIL
seu valor representa o arquivo que alguns programas usam para checar mensagens eletrônicas;
PATH
contém uma lista de diretórios onde o shell busca comandos;
EDITOR
seu valor é o nome do comando usado como editor de texto padrão de alguns programas;
VISUAL
seu valor é o nome do comando usado como editor de texto padrão de alguns programas;
USER
login do usuário.

Estas variáveis, por serem usadas por outros programas, devem ser definidas de forma especial:

          export EDITOR=emacs
          VISUAL="$EDITOR"
          MAIL="$HOME/Mail/Mailbox"
          export MAIL VISUAL

A Variável PATH

A variável PATH contém uma informação extremamente importante para o ambiente shell. Seu valor representa uma lista de diretórios por onde o shell procura pelos comandos que o usuário executa. Esta lista consiste de uma sequência de nomes de diretórios, separados por :

Por exemplo:

                   PATH="/bin:/usr/bin:/usr/X11/bin:/usr/local/bin"

Assim, na definição acima, está-se definindo que ao se digitar um comando, ele será procurado primeiro no diretório /bin. Se o arquivo correspondente ao comando não for encontrado, o shell procurará no diretório seguinte da lista (no caso, /usr/bin) e assim sucessivamente, até achar o programa. Quando o shell não encontra o programa em nenhum dos diretórios de PATH, é exibida uma mensagem de erro indicando que o comando não foi encontrado (command not found).

Em geral, sugere-se que o usuário altere o valor de PATH da seguinte forma:

                   PATH="${PATH}:dir1:dir2:...:dirn"
onde dir1, dir2, etc, são os novos diretórios por onde o usuário que o shell procure comandos. O elemento $PATH faz com que se ACRESCENTE ao valor de PATH os novos diretórios.

3.3 Configuração

Bibliografia

1
PET Informática.
Linux Básico.
UFPR, Outubro 2002.
URL http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxBasico/.



Armando Luiz Nicolini Delgado
2008-07-11