Sistemas Operacionais

Gestão de Arquivos no Linux

Aula interativa Prof. Raul de Araújo Lima · Sistemas de Informação · UniCatólica

Gestão de arquivos no Linux

Como o Linux organiza discos, pastas e arquivos em uma única árvore, e como navegar, criar, mover, procurar e proteger arquivos usando o terminal.

Navegação: ← → trocam de etapa · V alterna entre etapas e página única · M sumário · F tela cheia · + − tamanho do texto.

Os terminais desta aula são simulados no navegador: cada um tem o seu próprio sistema de arquivos, então experimente sem medo, nada afeta o seu computador. Dentro do terminal, Tab completa nomes, ↑ ↓ recuperam comandos e o botão ↺ Reiniciar volta tudo ao estado inicial. Os botões abaixo de cada terminal executam comandos de exemplo.

O que você digita fica salvo neste navegador; em Progresso você pode baixar um arquivo e continuar em outro computador.

Arquivos, diretórios e a árvore única

Um arquivo é uma sequência de bytes com um nome. Um diretório (pasta) é um arquivo especial que guarda uma lista de outros arquivos e diretórios.

No Linux existe uma única árvore, que começa na raiz, escrita /. Não há C: ou D:: um segundo disco ou um pendrive é montado em alguma pasta da árvore, como /media/aluno/PENDRIVE.

No Linux, quase tudo é arquivo: o disco aparece como /dev/sda, e as informações do processador podem ser lidas em /proc/cpuinfo como se fossem um texto.
WindowsLinux
Raizuma por disco: C:\, D:\uma só: /
Separador\/
MaiúsculasNotas.txt = notas.txtNotas.txt ≠ notas.txt
Extensãodefine o tipo do arquivoé só parte do nome (convenção)
Ocultosatributo do arquivonome começa com ponto: .bashrc
Pasta pessoalC:\Users\ana/home/ana

O interpretador de comandos (shell)

O shell é o programa que lê os comandos digitados pelo usuário (ou escritos em scripts), interpreta e pede ao sistema operacional que os execute. O bash é o shell mais popular e vem instalado por padrão em muitas distribuições.

O terminal é apenas a janela; o shell é quem roda dentro dela. Antes de cada comando, o shell mostra o prompt:

:

Seu primeiro terminal. Clique nos botões ou digite e tecle Enter:

Anatomia de um comando

  • Comando, opções e argumentos são separados por espaços. Um nome com espaço precisa de aspas: cd "Minhas Fotos".
  • O Linux diferencia maiúsculas de minúsculas: LS não é ls.
  • Quase todo comando aceita --help, um resumo das opções.

Repare na mensagem de LS: o shell não encontrou nenhum programa com esse nome.

Hierarquia de diretórios

As distribuições seguem um padrão (FHS) que diz o que fica em cada diretório. Clique em cada um.

Onde um usuário comum pode gravar?

DiretórioConteúdoUsuário comum grava?
/home/alunoseus arquivossim, é a sua casa
/tmptemporáriossim, todos podem
/home/mariaarquivos de outro usuárionão (nem consegue ver)
/etcconfiguraçõesnão, só o root
/bin, /usr, /libprogramas e bibliotecasnão, só o root
/var/logregistros do sistemanão; alguns nem pode ler
/rootcasa do administradornão (nem consegue entrar)

Essa separação é o que protege o sistema: um usuário comum não consegue, por engano ou por maldade, apagar os programas ou mudar as configurações de todos. Quem decide isso são as permissões, que veremos no fim da aula.

Caminhos absolutos e relativos

Um caminho indica onde está um arquivo na árvore.

  • Absoluto: começa na raiz, com /. Funciona de qualquer lugar: /home/aluno/notas.txt.
  • Relativo: parte do diretório atual. Se você está em /home/aluno, basta notas.txt.

Todo diretório tem dois nomes especiais, e o shell oferece mais dois atalhos:

SímboloSignificado
.o próprio diretório atual
..o diretório pai (um nível acima)
~a sua pasta pessoal (/home/aluno)
-no cd: o diretório em que você estava antes

Mude o caminho e veja como o shell o resolve, passo a passo:

whoami, echo e man

whoami: “quem sou eu?”

Mostra o nome do usuário que está usando o shell.

echo: o “print” do shell

Escreve um texto na saída. Também mostra o valor de variáveis do shell, como $USER e $HOME. Entre aspas simples, nada é substituído.

man: o manual

man comando abre o manual de qualquer comando, com todas as opções. No terminal real, use as setas para rolar e q para sair.

$ man ls

pwd e cd: onde estou e para onde vou

pwd (print working directory) mostra o caminho absoluto do diretório atual.

cd (change directory) muda o diretório atual:

ComandoVai para
cd Documentosa subpasta Documentos (relativo)
cd /etc/etc (absoluto)
cd ..o diretório pai
cd ../Downloadsa pasta “irmã” Downloads
cd ou cd ~a pasta pessoal
cd -o diretório anterior

Acompanhe o diretório atual no prompt, depois dos dois-pontos.

ls: listando o conteúdo de um diretório

OpçãoEfeito
-alista todos, inclusive os ocultos (nome começa com .)
-lformato longo: permissões, dono, tamanho, data de modificação
-htamanhos legíveis (K, M, G); use junto com -l
-Sordena pelo tamanho, do maior para o menor
-tordena pela data de modificação, do mais recente
-rinverte a ordem
-Rentra nos subdiretórios (recursivo)
-dmostra o diretório em si, não o seu conteúdo

As opções se combinam: ls -lhS, ls -ltr. As cores indicam o tipo: azul diretório verde executável.

Lendo a saída de ls -l

1º caractereTipoExemplo
-arquivo comumnotas.txt
ddiretórioDocumentos
llink simbólico (atalho)/bin → usr/bin
bdispositivo de bloco (discos)/dev/sda
cdispositivo de caractere/dev/tty

Sua vez: navegando

Cumpra os objetivos abaixo do terminal. Cada um fica verde quando for atingido.

Mostrar uma solução
$ whoami
$ cat /etc/hostname
$ ls -l /var/log
$ ls -a ~
$ cd ~/Documentos

Revisão: hierarquia e navegação

mkdir e rmdir: criando e removendo diretórios

mkdir (make directory) cria um ou vários diretórios de uma vez. Com -p, cria também os diretórios intermediários que ainda não existem.

$ mkdir aula7
$ mkdir fotos videos musicas
$ mkdir -p projeto/src/testes

rmdir (remove directory) remove diretórios, mas só se estiverem vazios. Caso contrário, dispara um erro: uma proteção contra apagar conteúdo por engano.

$ rmdir projeto
rmdir: falhou em remover 'projeto': Diretório não vazio

tree desenha a árvore de diretórios. Ele não vem instalado em todas as distribuições, mas ajuda muito a visualizar o resultado.

touch: criando arquivos vazios

touch cria um ou vários arquivos vazios de uma vez.

$ touch lista.txt
$ touch a.txt b.txt c.txt

Se o arquivo já existe, o touch não apaga nada: apenas atualiza a data de modificação para agora. Compare a data de notas.txt antes e depois.

A extensão é só parte do nome. touch relatorio e touch relatorio.txt criam arquivos igualmente válidos; a extensão serve para pessoas e programas reconhecerem o tipo de conteúdo.

cp: copiando arquivos e diretórios

Funciona como o “copiar e colar” do gerenciador de arquivos. O último argumento é o destino:

  • se o destino é um diretório existente, a cópia vai para dentro dele, com o mesmo nome;
  • senão, a cópia é criada com o novo nome.
$ cp notas.txt Documentos/
$ cp notas.txt notas_backup.txt
$ cp -r Documentos Documentos_backup

Para copiar diretórios, use -r (recursivo): sem ele, o cp pula o diretório.

Se o destino já existir, o cp o sobrescreve sem perguntar. Com -i, ele pede confirmação antes.

mv: movendo e renomeando

Funciona como o “recortar e colar”: o arquivo sai do lugar de origem. A regra do destino é a mesma do cp:

$ mv notas.txt Documentos/
$ mv Documentos/notas.txt Documentos/lembretes.txt
$ mv Imagens Fotos
  • Mover para um diretório existente: o arquivo vai para dentro dele.
  • Mover para um nome que não existe: o arquivo é renomeado. No Linux não há comando separado para renomear.
  • Diretórios são movidos inteiros, sem precisar de -r.
Assim como o cp, o mv sobrescreve o destino sem perguntar (a não ser com -i).

rm: removendo arquivos e diretórios

$ rm instalador.deb
$ rm -r Imagens
OpçãoEfeito
-rremove diretórios e todo o seu conteúdo
-fforça: não reclama de arquivo inexistente e não pergunta nada
-ipergunta antes de cada remoção
-vmostra cada item removido
Não existe lixeira no terminal. O que o rm apaga não volta. Confira o comando antes de teclar Enter, principalmente com -r, -f e curingas como *. O famoso rm -rf / tentaria apagar o sistema inteiro: as versões atuais recusam por segurança.

Curingas: *, ? e [ ]

Curingas descrevem vários nomes de uma vez. Quem os expande é o shell, antes de executar o comando: o rm *.pdf recebe a lista de nomes já pronta.

CuringaCasa comExemplo
*qualquer sequência, inclusive vazia*.jpg: todos os .jpg
?exatamente um caractereaula?.pdf: aula1.pdf, aula7.pdf
[ ]um caractere da lista[fw]*: começa com f ou w

Use echo para ver a expansão antes de usar o curinga em um comando perigoso: echo *.pdf mostra exatamente o que rm *.pdf apagaria.

Sua vez: arquivos e diretórios

Organize o material da aula na sua pasta pessoal.

Mostrar uma solução
$ mkdir -p aula7/exercicios aula7/anotacoes
$ touch aula7/anotacoes/resumo.txt
$ cp notas.txt aula7/lembretes.txt
$ mv Downloads/aula7.pdf aula7/
$ rm Downloads/instalador.deb
$ tree aula7

Revisão: arquivos e diretórios

Redirecionamento da saída: > e >>

Normalmente, a saída de um comando aparece na tela. Com os operadores de redirecionamento, ela vai para um arquivo:

OperadorEfeito
>cria o arquivo ou substitui todo o seu conteúdo
>>acrescenta no final, sem apagar o que havia
2>redireciona as mensagens de erro
<usa um arquivo como entrada do comando
$ echo "Texto qualquer" > arquivo.txt
$ echo "Mais uma linha" >> arquivo.txt
$ ls -l > listagem.txt
O > apaga o conteúdo anterior sem perguntar. Na dúvida, use >>.

cat, head, tail e wc

cat (de concatenar) junta o conteúdo de um ou mais arquivos e mostra o resultado. Com um arquivo só, serve para exibi-lo; com redirecionamento, para juntar arquivos.

$ cat notas.txt
$ cat parte1.txt parte2.txt > completo.txt
ComandoMostra
cat -n arqo arquivo com as linhas numeradas
head -n 3 arqas 3 primeiras linhas (padrão: 10)
tail -n 3 arqas 3 últimas linhas (ótimo para logs)
wc -l arqquantas linhas o arquivo tem (-w palavras, -c bytes)

sort e uniq: ordenando linhas

sort junta o conteúdo de um ou mais arquivos e mostra as linhas ordenadas. Ele não altera o arquivo original: para guardar o resultado, redirecione.

OpçãoEfeito
-rordem inversa
-ncompara como número: 2 antes de 10
-uremove as linhas repetidas
-fignora maiúsculas e minúsculas

uniq remove repetições consecutivas; com -c, conta quantas vezes cada linha aparece. Por isso costuma vir logo depois do sort.

Sem -n, os números são comparados como texto, caractere a caractere: 100 vem antes de 2, porque 1 vem antes de 2.

grep: procurando texto dentro de arquivos

Mostra as linhas que contêm um texto (padrão). Funciona com arquivos e, com -r, com diretórios inteiros.

$ grep texto arquivo
$ grep -r texto diretório
OpçãoEfeito
-iignora maiúsculas e minúsculas
-nmostra o número de cada linha
-vinverte: linhas que não contêm o texto
-csó conta as linhas encontradas
-rprocura em todos os arquivos dos diretórios
-lmostra só o nome dos arquivos que contêm o texto

find: procurando arquivos e diretórios

Enquanto o grep procura dentro dos arquivos, o find procura os próprios arquivos, percorrendo a árvore a partir de um diretório.

$ find onde critérios
$ find ~ -name "*.pdf"
$ find / -name passwd 2>/dev/null
CritérioEncontra
-name "padrão"pelo nome (aceita curingas)
-iname "padrão"pelo nome, sem diferenciar maiúsculas
-type f / -type dsó arquivos / só diretórios
-maxdepth Ndesce no máximo N níveis
-emptyarquivos ou diretórios vazios
Coloque o padrão entre aspas. Sem elas, o shell expande o * antes de o find receber o padrão. E 2>/dev/null descarta as mensagens de “Permissão negada”: /dev/null é um “buraco negro” que engole tudo o que recebe.

Pipes: combinando comandos com |

O pipe | liga a saída de um comando à entrada do próximo, como um cano. Cada comando faz uma coisa simples; combinados, resolvem problemas maiores.

$ ls | wc -l
$ cat frutas.txt | sort | uniq -c
$ grep SI alunos.csv | wc -l
$ ls -l /etc | grep passwd

Lendo o segundo exemplo da esquerda para a direita: mostra as frutas → ordena → conta as repetições.

Diferença importante: > manda a saída para um arquivo; | manda para outro comando.

Revisão: conteúdo e busca

Permissões: quem pode fazer o quê

No Linux, cada arquivo e diretório tem um dono e um grupo, e define permissões para três tipos de usuário:

u→dono (user) g→grupo (group) o→outros (others)

Para cada um, há três permissões, e o - indica a ausência dela:

r→leitura (read) w→gravação (write) x→execução (execute)
Em um arquivoEm um diretório
rler o conteúdo (cat)listar os nomes (ls)
walterar o conteúdocriar, renomear e apagar itens dentro dele
xexecutar como programa ou scriptentrar (cd) e acessar os itens

Quem é você? O comando id mostra o seu usuário e os grupos de que você faz parte.

Lendo as permissões

1102 out 20 10:30

O sistema verifica um único trio, nesta ordem:

  1. Se você é o dono, valem as permissões do dono.
  2. Senão, se você está no grupo do arquivo, valem as do grupo.
  3. Senão, valem as dos outros.

O root (administrador) ignora essas regras: pode ler e alterar qualquer arquivo.

Notação octal: permissões em números

Cada permissão vale um número; a soma de cada trio vira um dígito de 0 a 7:

r=4 w=2 x=1

Exemplo: rwx r-x r-- = (4+2+1) (4+0+1) (4+0+0) = 754.

OctalSímbolosUso típico
644rw-r--r--arquivos comuns
755rwxr-xr-xprogramas, scripts e diretórios
600rw-------arquivos privados (chaves, senhas)
700rwx------diretórios privados
777rwxrwxrwxtodos fazem tudo: evite!

Marque as caixas ou digite o número:

chmod: alterando permissões

$ chmod permissões arquivo

Há duas formas de escrever as permissões:

Octal: define tudo de uma vez

$ chmod 755 script.sh
$ chmod 600 senhas.txt

Simbólica: quem + operação + permissões

ComandoEfeito
chmod u+x script.shdá execução ao dono
chmod go-w notas.txttira a gravação do grupo e dos outros
chmod a+r aviso.txtdá leitura a todos (a = u, g e o)
chmod u=rw,g=r,o= rel.txtdefine exatamente: o mesmo que 640
chmod -R 750 projetoaplica em tudo o que está dentro

Só o dono do arquivo (ou o root) pode mudar suas permissões.

Um script só roda como programa se tiver permissão x:

bash script.sh funcionaria mesmo sem x: nesse caso quem executa é o bash, que só precisa ler o arquivo.

“Permissão negada” na prática

Experimente quebrar e consertar as permissões dos seus próprios arquivos, e veja o que acontece com os do sistema:

  • chmod 000 tira todas as permissões, até do dono. Como você continua sendo o dono, pode devolvê-las.
  • Um diretório sem x não deixa entrar; sem r, não deixa listar.
  • chown muda o dono de um arquivo, mas só o root pode usá-lo.
  • sudo comando executa um comando como root (pedindo a sua senha). Use apenas quando necessário: como root, nada é negado.
Resolver “Permissão negada” com chmod 777 ou sudo em tudo é como deixar a porta de casa aberta porque perdeu a chave. Dê apenas a permissão necessária.

Revisão: permissões

Missão 1: organizando os downloads básico

A pasta Downloads virou bagunça. Separe os arquivos por tipo, usando curingas para trabalhar com vários arquivos de uma vez.

Mostrar uma solução
$ cd ~/Downloads
$ mkdir imagens documentos
$ mv *.jpg *.png imagens/
$ mv *.pdf documentos/
$ mv musica.mp3 ~/Música/
$ rm instalador.deb
$ ls -R

Missão 2: estrutura de projeto básico

Monte a estrutura de pastas de um projeto em C, com um README e um histórico de alterações.

Mostrar uma solução
$ mkdir -p projeto/src projeto/docs projeto/testes
$ cd projeto
$ touch src/main.c src/util.c
$ echo "Projeto de SO" > README.md
$ echo "projeto criado" > docs/historico.txt
$ echo "pastas organizadas" >> docs/historico.txt
$ cp README.md testes/
$ cd src

Missão 3: investigação intermediário

Use grep, find, sort e redirecionamento para extrair informações.

Mostrar uma solução
$ grep SI ~/Documentos/alunos.csv
$ grep SI ~/Documentos/alunos.csv > ~/Documentos/alunos_si.txt
$ find ~ -name "segredo*"
$ cp ~/.config/cache/antigo/segredo_do_prof.txt ~
$ sort -u ~/Documentos/frutas.txt > ~/Documentos/frutas_ordenadas.txt
$ grep remove /var/log/dpkg.log > ~/remocoes.txt

Missão 4: permissões intermediário

Ajuste as permissões de cada item. Use ls -l para conferir antes e depois.

Mostrar uma solução
$ chmod 755 script.sh
$ ./script.sh
$ chmod 600 diario.txt
$ chmod 750 compartilhado
$ touch compartilhado/regras.txt
$ chmod 640 compartilhado/regras.txt
$ ls -l

Resumo dos comandos

ComandoPara quêExemplo
whoamiusuário atualwhoami
echoescrever textoecho "oi" > a.txt
manmanualman ls
pwddiretório atualpwd
cdmudar de diretóriocd ../Downloads
lslistarls -lah
mkdircriar diretóriomkdir -p a/b/c
rmdirremover diretório vaziormdir vazio
touchcriar arquivo vaziotouch a.txt
ComandoPara quêExemplo
cpcopiarcp -r fotos backup/
mvmover ou renomearmv a.txt b.txt
rmremover (sem lixeira!)rm -r pasta
catmostrar ou juntarcat a b > c
sortordenar linhassort -n numeros.txt
grepprocurar textogrep -rin erro /var/log
findprocurar arquivosfind ~ -name "*.pdf"
chmodmudar permissõeschmod 755 script.sh
> >> |redirecionar e encadearls | wc -l

Terminal livre

Espaço para experimentar durante a aula. Sugestões: monte a sua árvore de pastas do semestre; descubra quantos usuários existem em /etc/passwd com wc -l; procure com find / todos os arquivos .conf; crie um script com echo e >>, dê permissão de execução e rode-o.