Neste
post vamos continuar a falar sobre a linha de comandos, mais especificamente sobre os comandos mais utilizados para interagir com o sistema de ficheiros. No entanto, convém primeiro introduzir alguns conceitos sobre a hierarquia de pastas e sistema de permissões.
Vamos começar pela hierarquia de pastas. Abrimos um terminal, e executamos o seguinte comando:
$ ls /
O comando
ls serve para listar os ficheiros existentes numa determinada pasta, como já referimos em
posts anteriores. Ao escrevermos "/" como pasta, estamos a dizer ao comando para listar os conteúdos da
raiz do sistema de ficheiros. O sistema de ficheiros é equivalente a uma árvore, em que as pastas e sub-pastas são os ramos da árvore; por sua vez os ficheiros são as folhas da árvore. Assim sendo, a
raiz é a base do sistema de ficheiros, ou seja, o tronco da árvore. O comando anterior vai dar algo parecido com o seguinte:
bin etc lib lost+found proc selinux usr
boot home lib32 media root srv var
cdrom initrd.img lib64 mnt run sys vmlinuz
dev initrd.img.old libnss3.so opt sbin tmp vmlinuz.old
Estas são as pastas e ficheiros que existem na raiz do nosso sistema de ficheiros. Podemos usar o gestor de ficheiros gráfico para ver esta mesma informação. Na grande maioria das distribuições Linux basta clicar no ícone com uma pasta, e clicar de novo, no lado direito, onde diz "File System" ou "Sistema de Ficheiros", tal como indicado na imagem seguinte.
Não é crucial saber o significado de todos estes ficheiros e pastas que estão presentes na raiz do sistema de ficheiros. No entanto, pode ser importante pelo menos ter ideia para que servem três ou quatro destas pastas
1. Antes de nos debruçarmos sobre isso, o leitor mais atento reparou que a listagem apresentada pelo comando
ls não diferencia entre ficheiros, pastas e atalhos; para isso basta usar a opção "-l" (formato longo), ou "-g" (igual a "-l", mas não especifica o proprietário dos conteúdos). Todas as opções do comando
ls podem ser analisadas com o comando
man ls, como explicado no
post anterior. Repetindo o comando anterior, desta feita com a opção "-l", vamos obter algo parecido com o seguinte:
drwxr-xr-x 2 root root 4096 Oct 19 22:37 bin
drwxr-xr-x 3 root root 4096 Oct 19 22:59 boot
drwxr-xr-x 2 root root 4096 May 6 18:09 cdrom
drwxr-xr-x 17 root root 4140 Oct 23 17:21 dev
drwxr-xr-x 173 root root 12288 Oct 23 17:21 etc
drwxr-xr-x 5 root root 4096 May 6 18:10 home
lrwxrwxrwx 1 root root 32 Oct 19 22:36 initrd.img -> boot/initrd.img-3.5.0-17-generic
lrwxrwxrwx 1 root root 33 Oct 19 22:30 initrd.img.old -> /boot/initrd.img-3.5.0-17-generic
drwxr-xr-x 25 root root 4096 Oct 19 22:42 lib
drwxr-xr-x 2 root root 4096 Oct 19 21:48 lib32
drwxr-xr-x 2 root root 4096 Oct 19 22:42 lib64
lrwxrwxrwx 1 root root 36 Oct 19 22:22 libnss3.so -> /usr/lib/x86_64-linux-gnu/libnss3.so
drwx------ 2 root root 16384 May 6 18:04 lost+found
drwxr-xr-x 3 root root 4096 Oct 21 01:28 media
drwxr-xr-x 2 root root 4096 May 7 20:19 mnt
drwxr-xr-x 9 root root 4096 Sep 4 16:17 opt
dr-xr-xr-x 289 root root 0 Oct 23 16:46 proc
drwx------ 11 root root 409drwxr-xr-x 2 root root 4096 Oct 19 22:37 bin
drwxr-xr-x 3 root root 4096 Oct 19 22:59 boot
drwxr-xr-x 2 root root 4096 May 6 18:09 cdrom
drwxr-xr-x 17 root root 4140 Oct 23 17:21 dev
drwxr-xr-x 173 root root 12288 Oct 23 17:21 etc
drwxr-xr-x 5 root root 4096 May 6 18:10 home
lrwxrwxrwx 1 root root 32 Oct 19 22:36 initrd.img -> boot/initrd.img-3.5.0-17-generic
lrwxrwxrwx 1 root root 33 Oct 19 22:30 initrd.img.old -> /boot/initrd.img-3.5.0-17-generic
drwxr-xr-x 25 root root 4096 Oct 19 22:42 lib
drwxr-xr-x 2 root root 4096 Oct 19 21:48 lib32
drwxr-xr-x 2 root root 4096 Oct 19 22:42 lib64
lrwxrwxrwx 1 root root 36 Oct 19 22:22 libnss3.so -> /usr/lib/x86_64-linux-gnu/libnss3.so
drwx------ 2 root root 16384 May 6 18:04 lost+found
drwxr-xr-x 3 root root 4096 Oct 21 01:28 media
drwxr-xr-x 2 root root 4096 May 7 20:19 mnt
drwxr-xr-x 9 root root 4096 Sep 4 16:17 opt
dr-xr-xr-x 289 root root 0 Oct 23 16:46 proc
drwx------ 11 root root 4096 Oct 19 22:26 root
drwxr-xr-x 25 root root 860 Oct 23 17:56 run
drwxr-xr-x 2 root root 12288 Oct 19 22:15 sbin
drwxr-xr-x 2 root root 4096 Mar 5 2012 selinux
drwxr-xr-x 2 root root 4096 Apr 25 17:04 srv
dr-xr-xr-x 13 root root 0 Oct 23 16:46 sys
drwxrwxrwt 19 root root 12288 Oct 23 19:33 tmp
drwxr-xr-x 12 root root 4096 Oct 19 20:00 usr
drwxr-xr-x 14 root root 4096 Oct 23 15:45 var
lrwxrwxrwx 1 root root 29 Oct 19 22:36 vmlinuz -> boot/vmlinuz-3.5.0-17-generic
lrwxrwxrwx 1 root root 29 Oct 19 22:30 vmlinuz.old -> boot/vmlinuz-3.5.0-17-generic
A opção "-l" dá-nos muito mais informação. Aqui fica uma breve explicação sobre o significado desta informação, coluna a coluna, tendo como exemplo a primeira linha:
drwxr-xr-x 2 root root 4096 Oct 19 22:37 bin
- drwxr-xr-x = A primeira letra indica o tipo de arquivo, enquanto as restante letras indicam as permissões do arquivo (sobre isto falaremos adiante). Sobre a primeira letra, eis os códigos mais relevantes:
- d= pasta
- l = atalho (soft link)
- - = ficheiro
- 2 = Número de hard links para o arquivo. Se se tratar de uma pasta este valor indica o número de sub-pastas + a própria pasta + a pasta mãe (a pasta em questão, bin, tem o valor 2 pois não tem sub-pastas, ou seja, este valor corresponde a ela própria e à pasta mãe, neste caso a raiz). Se se tratar de um ficheiro, então este valor indica por quantos nomes é conhecido o ficheiro em questão no sistema de ficheiros2.
- root = Nome do utilizador proprietário do arquivo. Neste caso, root corresponde ao nome dado ao administrador principal de todos os sistemas Linux (também conhecido como super-utilizador).
- root = Corresponde do nome do grupo a que pertence o utilizador proprietário do ficheiro. Para os utilizadores normais, o nome do grupo a que pertencem é tipicamente igual ao seu nome de utilizador (como é o caso no arquivo em questão).
- 4096 = Tamanho do arquivo em bytes. Em Linux, as pastas normalmente ocupam 4096 bytes (ou 4 Kb).
- Oct 19 22:37 = Data e hora de última modificação do arquivo.
- bin = Nome do arquivo.
Alguma desta informação também pode ser obtida na maioria dos gestores de ficheiros gráficos, bastando para isso carregar nas teclas Ctrl+2 (primeira das imagens seguintes). Se quisermos mais pormenores sobre uma pasta ou ficheiros podemos clicar com o botão direito em cima da respetiva pasta ou ficheiro e selecionar "Properties" ou "Propriedades" (segunda das imagens seguintes).
Voltando à questão das permissões, vamos olhar de novo para a primeira linha da listagem, mais concretamente para a informação na primeira coluna:
drwxr-xr-x 2 root root 4096 Oct 19 22:37 bin
Como já mencionamos, a primeira letra indica o tipo de arquivo. No caso em questão, o arquivo
bin é uma pasta, tal como indicado pela primeira letra,
d (de directoria). Os restante nove caracteres podem ser divididos em três partes com três caracteres cada, que correspondem às permissões para: 1) o proprietário do arquivo; 2) para o grupo a que pertence o proprietário do arquivo; e, 3) para todos os outros utilizadores. No caso da pasta
bin, temos que:
- rwx = Permissões para o proprietário (owner) do arquivo (utilizador root).
- r-x = Permissões para o grupo (group) a que pertence o proprietário do arquivo (grupo root).
- r-x = Permissões para todos os outros (other).
Existem três tipos de permissões. O primeiro caractere de cada parte corresponde à permissão de leitura (
read), o segundo caractere é a permissão de escrita (
write) e o terceiro caractere é a permissão de execução (
execute). O que significam então cada uma destas permissões?
- read = Permissão de leitura, isto é, é possível ler/aceder aos conteúdos do arquivo.
- write = Permissão de escrita, isto é, é possível modificar os conteúdos do arquivo ou até mesmo eliminar o arquivo.
- execute = Permissão de execução, isto é, é possível executar o arquivo como um programa3.
Podemos então concluir que diferentes utilizadores vão estar sujeitos a diferentes permissões para determinado arquivo consoante sejam proprietários (
owner), pertencentes ao grupo do proprietário (
group) ou outra coisa qualquer (
other). Voltando ao caso da pasta
bin:
- rwx = O proprietário (owner), ou seja o utilizador root, pode ler, escrever e executar o arquivo4.
- r-x = Os utilizadores que pertencem ao grupo (group) de nome root podem ler os conteúdos do arquivo (neste caso, podem fazer ls à pasta) e executar o arquivo (neste caso, podem fazer cd à pasta); no entanto não podem escrever no arquivo (neste caso, não podem adicionar ou remover outros arquivos dentro da pasta).
- r-x = Os restantes utilizadores (other) têm as mesmas permissões que os utilizadores do grupo (group), ou seja, podem ler e executar o arquivo, mas não podem escrever.
No próximo post falaremos sobre as várias formas de alterar as permissões de pastas ou ficheiros, nomeadamente usando o comando
chmod. Além disso, discutiremos ainda a possibilidade de alterar o proprietário (owner) de um ficheiro ou pasta através do comando
chown.
Vamos então discutir os comandos mais utilizados para interagir com o sistema de ficheiros. Antes de mais, vamos situar-nos na nossa pasta "Home" (por defeito, ao abrirmos uma nova janela de terminal, vamos estar automaticamente situados na nossa pasta "Home"):
$ cd /home/<o_meu_username>
No Linux, o simbolo "~" significa a pasta "Home" do utilizador atual. Ou seja, o comando anterior é igual a fazer:
$ cd ~
Usando o comando
mkdir (make directory) vamos criar uma pasta para fazermos as experiências:
$ mkdir explica
Através do comando
cd (change directory) vamos entrar na nova pasta:
$ cd explica
É possível sabermos em que pasta estamos através do comando pwd:
$ pwd
Com o editor de texto
nano (podes usar o
gedit ou outro editor se preferires), vamos criar um novo ficheiro:
$ nano teste.txt
Queremos encher este ficheiro com texto para fazermos algumas experiências. Seleciona todo o texto deste blog com o rato (ou então faz Ctrl+A que faz automaticamente o
select all), faz Editar=>Copiar (ou Edit=>Copy), e voltando ao terminal, clica com o botão direito do rato em cima do terminal e faz Colar (ou Paste) - se tiveres no terminal podes também fazer Ctrl+Shift+V. Agora temos o nosso ficheiro de texto. No
nano faz Ctrl+O para guardar o ficheiro e Ctrl+X para sair. Podemos experimentar ver o conteúdo do ficheiro usando o comando
cat:
$ cat teste.txt
Era muito conteúdo? Passou muito rápido? Não há problema, podemos usar o comando
more ou o comando
less para ir vendo o conteúdo do ficheiro linha a linha:
$ more teste.txt
$ less teste.txt
O comando
more só permite andar para baixo com a tecla Enter (ou seja, não podemos voltar a ler linhas que já passámos). Por sua vez, o comando
less permite andar para trás e para a frente no ficheiro usando as teclas de direção
5.
Se quisermos mudar o nome ao ficheiro, usamos o comando
mv:
$ mv teste.txt novonome.txt
O comando
mv faz mais do que mudar o nome a ficheiros.
mv é diminuitivo de
move, ou seja, o seu propósito é mover ficheiros ou pastas de um lado para outro. Para verificar isto, vamos criar uma nova pasta (dentro da atual pasta "explica"):
$ mkdir uma_subpasta
Agora vamos mover o ficheiro que criámos para esta sub-pasta:
$ mv novonome.txt uma_subpasta
Em vez de mudar o nome do ficheiro, o comando
mv moveu o ficheiro "novonome.txt" para o directório "uma_subpasta". Podemos confirmar isto com o comando
$ ls -l
que nos dará um resultado parecido com o seguinte (repara nas permissões, etc.):
drwxrwxr-x 2 explica explica 16384 Oct 24 22:49 uma_subpasta
Ou seja, vemos a pasta que criámos, mas não vemos o ficheiro "novonome.txt". Vamos entrar na sub-pasta
$ cd uma_subpasta
e fazer de novo
$ ls -l
comando que nos dará aproximadamente a seguinte informação (repara nas permissões, etc.) :
-rw-rw-r-- 1 explica explica 25347 Oct 24 22:49 novonome.txt
Ou seja, confirmamos que efetivamente o ficheiro foi movido para a sub-pasta. Então e se quisermos apenas copiar o ficheiro (e não movê-lo) ficando com uma cópia do ficheiro na pasta "explica" e outra cópia na pasta "uma_subpasta"? Nesse caso usamos o comando
cp (
copy):
$ cp novonome.txt ..
O comando anterior copia o ficheiro "novonome.txt" para a pasta mãe da pasta "uma_subpasta", que é a pasta atual. A pasta mãe é é a pasta "explica".
Estamos quase a chegar ao fim deste
post, mas antes de terminarmos vamos eliminar os ficheiros e pastas que criámos. Podemos começar pelo ficheiro "novonome.txt":
$ rm novonome.txt
Vamos voltar à pasta anterior, fazendo:
$ cd ..
Agora vamos apagar a sub-pasta...
$ rmdir uma_subpasta
...e a cópia do ficheiro que copiámos para a pasta "explica":
$ rm novonome.txt
Voltamos agora à pasta anterior (a nossa pasta "Home"):
$ cd ..
E removemos a primeira pasta que criámos:
$ rmdir explica
Não é possível remover pastas que não estão vazias com o comando
rmdir (
remove directory). No entanto estas remoções poderiam ser feitas de uma assentada usando as opções "r" e "f" do comando
rm (
remove). Assumindo que estamos na nossa pasta "Home":
$ rm -rf explica
Muito cuidado com as opções "r" e "f". A primeira apaga os conteúdos de todas as sub-pastas da pasta indicada, enquanto a segunda força a remoção de tudo e não pergunta nada. É por isso muito fácil fazer asneira com estas opções.
Hoje ficamos por aqui. Se tiveres dúvidas em alguns dos comandos aqui usados não hesites em usar o comando
man para tirar dúvidas. No próximo
post falaremos de
wildcards, que servem para selecionar vários ficheiros e/ou pastas de uma assentada, bem como de alguns comando úteis tais como o
ln,
grep,
find,
sudo,
chmod,
chown e
apt-get.
Até breve!
1Deixo aqui uma lista sucinta sobre os conteúdos de algumas das pastas mais importantes presentes na raiz:
- /bin = Contém os comandos mais importantes, que podem ser utilizados por todos os utilizadores do sistema. Experimenta fazer ls /bin, e vais imediatamente reconhecer alguns dos comandos presentes.
- /etc = Contém ficheiros de configuração do sistema e de algumas aplicações instaladas no sistema.
- /home = Contém as pastas "Home" de todos os utilizadores do sistema. Cada uma destas pastas contém os documentos, imagens, vídeos, música, etc. de cada utilizador. Se fizeres ls /home/<o_teu_username> vais ver todos os ficheiros e pastas presentes na tua pasta "Home". Se fizeres ls ~ vais ter o mesmo efeito, pois o Linux substitui o ~ pelo caminho completo da pasta "Home" do utilizador atual (isto é, substitui o ~ por /home/<o_teu_username>).
- /lib, /lib32 e /lib64 = Bibliotecas (conjuntos de funções) essenciais e módulos importantes do núcleo do sistema (kernel).
- /mnt e /media = Contém sub-pastas que são mapeadas em sistemas de ficheiros amovíveis (pens USB, CD-ROM, discos externos, etc.).
- /opt = Pasta onde normalmente são instaladas aplicações externas, isto é, que não estão presentes no AppCenter da distribuição Linux.
- /usr = Pasta muito importante do sistema, com dados partilhados entre todos os utilizadores. Estes dados estão divididos em sub-pastas:
- /usr/doc = Documentação das aplicações instaladas.
- /usr/share = Ficheiros de configuração, icones, gráficos, etc. das aplicações instaladas
- /usr/src = Código fonte do software instalado no sistema, incluindo o núcleo (kernel) do Linux.
- /usr/include = Ficheiros de cabeçalho (com extensão .h) para o compilador C/C++. Estes ficheiros definem as estruturas e constantes que são necessárias para compilar a maioria dos programas. Já usámos um destes ficheiros, chamado stdio.h, no nosso primeiro programa em C.
- /usr/local = Tem uma funcionalidade semelhante à pasta /opt.
- /var = Contém ficheiros de dados que mudam permanentemente, tais como spools de impressão, dados de registos (logs) e de admistração e outros ficheiros temporários.
- /tmp = Contém ficheiros temporários, como por exemplo downloads efetuados com o browser.
2Esta explicação não está inteiramente correcta do ponto de vista técnico. A questão dos hard links em Linux não é muito simples, mas está bem explicada aqui (nomeadamente a diferença para os soft links). Os hard links não são atalhos, mas sim nomes alternativos para uma pasta ou ficheiro. No mínimo um ficheiro tem um hard link (ele próprio), e uma pasta tem no mínimo dois hard links: ela própria e uma referência a ela própria chamada "." (se fizermos ls -a para vermos os arquivos escondidos começados por ".", podemos verificar que existe sempre um "." dentro de todas as pastas, incluindo a raiz; existe também um arquivo chamado "..", que corresponde à pasta mãe da pasta actual - a raiz não tem pasta mãe, logo não tem ".."). Em Linux, os atalhos correspondem àquilo que se designa por soft link, que são na prática ficheiros independentes e que correspondem a atalhos para outros arquivos (ficheiros ou pastas). Tanto os hard links como os soft links são criados com o comando ln.
3O nosso primeiro programa em C é um ficheiro com permissão execute, uma vez que é possível executar/correr o programa. Ao compilar um programa, o comando gcc atribui sempre a permissão execute ao ficheiro gerado.
4
No caso de pastas, a permissão execute significa poder entrar na pasta, ou seja, no caso em questão significa poder fazer cd bin.
5Por isso se costuma dizer que less is more, ou seja, menos é mais...