Linux Essencial/Lição Manipulação de arquivos

Origem: Wikilivros, livros abertos por um mundo aberto.
  • Objetivo(s): Oferecer orientações sobre como é feita a manipulação de arquivos via linha de comando.
  • Direitos autorais e licença: Veja notas de direitos autorais e licença no final da lição.

Comandos de manipulação de arquivos[editar | editar código-fonte]

Os comandos de manipulação de arquivos implementam uma das mais importantes funções em qualquer sistema operacional. Por exemplo, funções como criar arquivos, removê-los e procurá-los são de vital, importância para o uso do sistema.

Os principais comandos de manipulação de arquivos são:

touch[editar | editar código-fonte]

O comando touch serve para dois fins: criar um novo arquivo (vazio), ou atualizar a data e hora de acesso e modificação de arquivos existentes. Note que o GNU/Linux não faz distinção de arquivos por conta de suas extensões. Programas específicos as utilizam para saber proceder com a forma correta de manipulá-los.

Sintaxe:

touch arquivo

Exemplo:

$touch teste sistema

No exemplo acima serão criados dois arquivos, o arquivo teste e o arquivo sistema.

cp[editar | editar código-fonte]

O comando cp (copy paste) é utilizado para se fazer cópias tanto de arquivos quanto de diretórios. Quando um diretório for copiado, é desejável que todo seu conteúdo também seja copiado. Esse conceito é conhecido como cópia recursiva.

Sintaxe:

cp [opção] origem destino

Portanto, o comando necessita de um arquivo de origem, o qual será copiado, e de um destino, local onde será colocado a sua cópia. Para esse caso, o original continuará existindo. Podem ser realizadas várias cópias de arquivos e diretórios de uma só vez, devendo, obrigatoriamente, o destino ser um diretório.

Opções:

-b - cria um arquivo de backup. Caso o usuário queira sobrescrever o arquivo existente, automaticamente é acrescentado o caractere “~” ao final do nome;

-i - caso o arquivo de origem já exista no destino, o comando irá perguntar ao usuário se ele deseja sobrescrever o existente;

-f - simplesmente copia, sem perguntar nada para o usuário (faz uma cópia forçada);

-R - trabalha com a ideia de recursividade, sendo utilizado para a cópia de diretórios e sub-diretórios;

-v - lista os arquivos enquanto estão sendo copiados.

Exemplo:

$ cp arquivo1 /tmp

nesse exemplo o arquivo1 que está no diretório corrente é copiado para o diretório /tmp.

Outro exemplo:

$ cp /usr/src/local/arquivo_distante .

Nesse caso o arquivo distante se encontra dentro de um local diferente de onde está o usuário e a cópia é feita para o “.”, ou seja, o diretório corrente.

Copiando diretório:

$ cp -R tmp /tmp

Agora o usuário está tentando copiar um diretório, incluindo seus subdiretórios, para dentro de outro diretório.

O comando também permite a cópia de vários arquivos de uma vez, como no exemplo:

$ cp arquivo1 arquivo2 arquivo3 arquivo4 /tmp/pasta/

Nesse caso, o destino, o último argumento, teve que ser um diretório. Quando é realizada uma cópia simples, ou seja, só de um arquivo, o mesmo pode ter o seu nome alterado na entrega, conforme o exemplo:

$ cp arquivo1 /tmp/arquivo

Desse modo o arquivo1 continua existindo no diretório aluno, mas também possui uma cópia com o nome de arquivo dentro do /tmp, realizando uma falsa renomeação de arquivo, já que o original continuou existindo.

mv[editar | editar código-fonte]

O comando mv (move) move ou renomeia arquivos ou diretórios. Possui sintaxe de uso similar ao cp. O resultado, entretanto, é diferente: o arquivo original não é preservado.

Sintaxe:

mv [opção] origem destino

A origem pode ser um arquivo ou diretório. No uso do mv não é necessário indicar a recursividade. O destino é o local para onde está sendo levado a origem ou o novo nome dado.

opção:

-f - realiza o comando sem perguntar se já existe um arquivo ou diretório com o mesmo nome no destino;

-i - pergunta antes de substituir algum arquivo com o mesmo nome no destino;

-v - lista os arquivos que estão sendo movidos.

Exemplo:

$ mv -i arquivo1 /tmp
$ mv arquivo2 /tmp/arquivo_novo
$ mv tmp/ /tmp/pasta

No primeiro exemplo o arquivo1 é movido para dentro do /tmp. Caso existisse um arquivo ou diretório chamado arquivo1, lá dentro, o sistema iria perguntar para o usuário se ele desejaria sobrescrevê-lo.

No segundo exemplo o arquivo2 é movido para dentro do /tmp, mas com um nome novo que, nesse caso, é chamado de arquivo_novo.

No terceiro exemplo é movido um diretório.

mkdir[editar | editar código-fonte]

O comando mkdir (make directory) serve para a criação de diretórios. Um diretório é um local que serve de armazenamento para outros diretórios ou arquivos, criando-se assim, uma estrutura organizada.

Sintaxe:

mkdir [opção] diretório [diretórios]

opção: -p - cria vários diretórios, que forem especificados, em níveis diferentes.

diretórios - representa a colocação de outros diretórios em uma mesma linha.

Exemplos:

$ mkdir pasta1
$ mkdir /tmp/pasta1
$ mkdir /tmp/pasta2 /tmp/pasta3 pasta4

Nos exemplos acima são criados vários diretórios de forma semelhantes mas em lugares diferentes, ou seja, com a utilização de caminhos absolutos e caminhos relativos.

No exemplo abaixo é possível observar a utilização da opção "-p" para a criação de subdiretórios:

$ mkdir -p pasta1/pasta2/pasta3/pasta4

Desse modo, será gerado o diretório pasta1, dentro dele será gerado o diretório pasta2, dentro do pasta2 estará a pasta3 e por final será criado a pasta4 dentro da pasta3.

rmdir[editar | editar código-fonte]

Esse comando serve para remover diretórios. Ele deve ser utilizado somente sobre diretórios, não tendo utilidade sobre arquivos. Desse modo, se existir um arquivo dentro do diretório, o mesmo não será apagado. O rmdir também trabalha com a idéia de recursividade.

Sintaxe:

rmdir [opção] diretório [diretórios]

opção:

-p - remove subdiretórios recursivamente.

diretórios - pode ser passado mais de um diretório por vez para ser apagado.

Exemplo:

$ rmdir pasta2

rm[editar | editar código-fonte]

A função desse comando é a de remoção de arquivos, mas se trabalhado com a recursividade, o mesmo poderá servir para deletar diretórios vazios ou não. Essa última característica do rm é muito utilizado para a remoção de diretórios muito grandes, com múltiplos níveis, de maneira rápida.

Sintaxe:

rm [opção] arquivo/diretório

opção:

-f - força a remoção do arquivo, ou seja, apaga sem perguntar;

-i - pergunta se realmente é o arquivo a ser apagado;

-r - recursivo, é utilizado para a remoção de diretórios e subdiretórios.

Exemplo:

$ rm -i arquivo1
$ rm -f arquivo2 arquivo3 /tmp/arquivo4
$ rm -rf pasta1

Nos exemplos acima são demonstrados o uso do rm, sendo que no primeiro exemplo o arquivo1 é removido dentro do diretório corrente e é perguntado se o arquivo realmente deve ser apagado. No segundo exemplo já não é perguntado e também é feia a remoção de um arquivo que não está dentro do diretório corrente. No último exemplo um diretório é removido.

NOTA: o comando rm -rf deve ser usado com muito cuidado, pois qualquer diretório ali indicado será apagado, sem a confirmação.

Caracteres curingas[editar | editar código-fonte]

Os caracteres curingas são de muita importância na manipulação de arquivos ou diretórios. Com eles é possível, por exemplo, especificar vários arquivos ou diretórios de maneira bastante simplificada.

Os curingas são substituições que ocorrem na posição da letra ou número procurado por um caractere, ou ainda completando a palavra, de forma prefixal ou sufixal.

Os caracteres curingas utilizados são: *, ?, [] e {}.

Asterisco (*)[editar | editar código-fonte]

O * é um dos mais poderosos caracteres curingas, podendo completar nomes de pasta ou arquivos com qualquer quantidade de caracteres, tanto no prefixo quanto no sufixo.

Sintaxe:

ls *resto_nome ou ls inicio_nome*

Exemplo: Para esse exemplo será utilizado os seguintes arquivos:

teste11
teste2
11teste
2teste

Linha de comando para listar os nomes de arquivos que comecem a palavra teste:

$ls teste*
teste11 teste2

Os outros dois arquivos não apareceram na lista, pois o caractere especial estava no final do nome. Para que fosse possível detectá-los, o caractere asterisco deveria estar no início do nome (ls teste) ou representado no início e no final da listagem (ls *teste).

Interrogação(?)[editar | editar código-fonte]

O caractere especial “?” difere do “*” no aspecto quantidade de caracteres. Enquanto o “*” abrange qualquer número de caractere, o “?” irá substituir exatamente um caractere, qualquer que seja ele. Como a sua utilização é muito limitada, ela possui uma vantagem sobre outros caracteres especiais, por exemplo, na listagem de uma pasta com vários arquivos de instalação, existem vários arquivos com nomes iguais, mas com as versões diferentes, sendo possível encontrar as versões para um determinado grupo de arquivos. Sintaxe:

ls nome?procurado ou ls nome_procurado? ou ls ?nome_procurado

Pela sintaxe é possível perceber que o caractere "?" pode ser fixado em qualquer lugar do nome, sendo que ele irá substituir um único caractere para sua posição, podendo ser utilizados vários caracteres de "?".

Exemplo:

Utilizando os arquivos do exemplo anterior:

$ls teste??
teste11

Outro exemplo:

$ls teste?
teste2

No primeiro exemplo o arquivo teste11 apareceu devido a utilização de dois caracteres "?" na hora da pesquisa, e o teste2 apareceu pois o caractere "?" não pode ser substituído por nada. Outro exemplo:

Em um determinado diretório, você possui várias versões de pacotes compilados do kernel:

kernel-2.4.20-9.i386.deb
kernel-2.4.20-9.i586.deb
kernel-2.4.20-9.i686.deb
kernel-2.4.20-9.athlon.deb
kernel-2.4.20-9.ia64.deb

Para listar apenas os pacotes compilados para arquitetura Intel de 32bits, você poderá utilizar o seguinte comando:

ls kernel-2.4.20-9.i?86.deb

Que retornaria:

kernel-2.4.20-9.i386.deb
kernel-2.4.20-9.i586.deb
kernel-2.4.20-9.i686.deb

Colchetes([ ])[editar | editar código-fonte]

Os valores entre colchetes serão tratados como uma lista, e irão substituir os valores um a um no local indicado. A sua utilização é muito semelhante ao caractere "?", diferenciando-se quanto a restrição dos valores aceitos.

Sintaxe:

ls nome[valores] ou ls [valores]nome ou ls no[valores]me       

Para o último caso o nome do argumento deverá ser escrito dessa maneira:

Exemplo:

$ls teste[123]
teste2

Sendo assim, não seria possível a apresentação do arquivo teste11, pois os caracteres entre colchetes são substituídos um a um.

Vejamos outro exemplo, utilizando o diretório de pacotes do kernel do exemplo anterior:

ls kernel-2.4.20-9.i[56]86.rpm

Retornaria apenas os pacotes para processadores Intel pentium e superiores:

kernel-2.4.20-9.i586.rpm
kernel-2.4.20-9.i686.rpm

Chaves ({ })[editar | editar código-fonte]

O uso desse caractere especial se assemelha muito ao uso dos colchetes, mas nesse caso podem ser apresentados vários tipos de valores com mais de um caractere cada, separados por vírgulas. Sintaxe:

ls nome{vA,vB} ,ls {vA,vB}nome ou ls no{vA,vB}me

Exemplo:

$ls teste{1,2,3,11}
ls: teste1: Arquivo ou diretório não encontrado
ls: teste3: Arquivo ou diretório não encontrado
teste11 teste2

NOTA: Outra característica do caractere "{ }" é que todos os valores serão substituídos e depois listados. Se o valor não existir será retornado o erro conforme o exemplo dado.

Exercícios de Revisão[editar | editar código-fonte]

1. Copie três arquivos que começam com a letra c do diretório /etc, para dentro da pasta do root, renomeie o terceiro arquivo copiado-o para testado, liste o conteúdo do diretório do root.

2. Criar um diretório com 2 subdiretórios dentro.

  • a) Adicionar um arquivo dentro de um dos subdiretórios usando o caminho absoluto.
  • b) Tente remover o diretório com os subdiretórios e o arquivo. O que aconteceu? Como pode ser removido o diretório?

3. Liste todos os diretórios de /etc/init.d que terminem em .sh.

4. Informe a sequência de comandos necessários para criar a seguinte árvore de diretórios na sua pasta pessoal:

  • ~
    • \---> dir1
      • \---> dir1.1
      • \---> dir1.2
        • \---> dir1.2.1

5. Considerando a árvore de diretórios criada acima, forneça qual a sequência de comandos necessários para: 5.1. copiar o arquivo /etc/passwd para o diretório dir1.2. 5.2. copiar a árvore completa de diretórios e subdiretórios do /bin para o diretório dir1.2.1. 5.3. criar um arquivo chamado nome.txt no diretório dir1.