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.
/dev/sda, e as informações do processador podem ser lidas em /proc/cpuinfo como se fossem um texto.| Windows | Linux | |
|---|---|---|
| Raiz | uma por disco: C:\, D:\ | uma só: / |
| Separador | \ | / |
| Maiúsculas | Notas.txt = notas.txt | Notas.txt ≠ notas.txt |
| Extensão | define o tipo do arquivo | é só parte do nome (convenção) |
| Ocultos | atributo do arquivo | nome começa com ponto: .bashrc |
| Pasta pessoal | C:\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:
LSnã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ório | Conteúdo | Usuário comum grava? |
|---|---|---|
/home/aluno | seus arquivos | sim, é a sua casa |
/tmp | temporários | sim, todos podem |
/home/maria | arquivos de outro usuário | não (nem consegue ver) |
/etc | configurações | não, só o root |
/bin, /usr, /lib | programas e bibliotecas | não, só o root |
/var/log | registros do sistema | não; alguns nem pode ler |
/root | casa do administrador | nã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, bastanotas.txt.
Todo diretório tem dois nomes especiais, e o shell oferece mais dois atalhos:
| Símbolo | Significado |
|---|---|
. | 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:
| Comando | Vai para |
|---|---|
cd Documentos | a subpasta Documentos (relativo) |
cd /etc | /etc (absoluto) |
cd .. | o diretório pai |
cd ../Downloads | a 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ção | Efeito |
|---|---|
-a | lista todos, inclusive os ocultos (nome começa com .) |
-l | formato longo: permissões, dono, tamanho, data de modificação |
-h | tamanhos legíveis (K, M, G); use junto com -l |
-S | ordena pelo tamanho, do maior para o menor |
-t | ordena pela data de modificação, do mais recente |
-r | inverte a ordem |
-R | entra nos subdiretórios (recursivo) |
-d | mostra 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º caractere | Tipo | Exemplo |
|---|---|---|
- | arquivo comum | notas.txt |
d | diretório | Documentos |
l | link simbólico (atalho) | /bin → usr/bin |
b | dispositivo de bloco (discos) | /dev/sda |
c | dispositivo 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.
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.
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.
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ção | Efeito |
|---|---|
-r | remove diretórios e todo o seu conteúdo |
-f | força: não reclama de arquivo inexistente e não pergunta nada |
-i | pergunta antes de cada remoção |
-v | mostra cada item removido |
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.
| Curinga | Casa com | Exemplo |
|---|---|---|
* | qualquer sequência, inclusive vazia | *.jpg: todos os .jpg |
? | exatamente um caractere | aula?.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:
| Operador | Efeito |
|---|---|
> | 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
> 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
| Comando | Mostra |
|---|---|
cat -n arq | o arquivo com as linhas numeradas |
head -n 3 arq | as 3 primeiras linhas (padrão: 10) |
tail -n 3 arq | as 3 últimas linhas (ótimo para logs) |
wc -l arq | quantas 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ção | Efeito |
|---|---|
-r | ordem inversa |
-n | compara como número: 2 antes de 10 |
-u | remove as linhas repetidas |
-f | ignora 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.
-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ção | Efeito |
|---|---|
-i | ignora maiúsculas e minúsculas |
-n | mostra o número de cada linha |
-v | inverte: linhas que não contêm o texto |
-c | só conta as linhas encontradas |
-r | procura em todos os arquivos dos diretórios |
-l | mostra 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ério | Encontra |
|---|---|
-name "padrão" | pelo nome (aceita curingas) |
-iname "padrão" | pelo nome, sem diferenciar maiúsculas |
-type f / -type d | só arquivos / só diretórios |
-maxdepth N | desce no máximo N níveis |
-empty | arquivos ou diretórios vazios |
* 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.
> 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:
Para cada um, há três permissões, e o - indica a ausência dela:
| Em um arquivo | Em um diretório | |
|---|---|---|
r | ler o conteúdo (cat) | listar os nomes (ls) |
w | alterar o conteúdo | criar, renomear e apagar itens dentro dele |
x | executar como programa ou script | entrar (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
O sistema verifica um único trio, nesta ordem:
- Se você é o dono, valem as permissões do dono.
- Senão, se você está no grupo do arquivo, valem as do grupo.
- 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:
Exemplo: rwx r-x r-- = (4+2+1) (4+0+1) (4+0+0) = 754.
| Octal | Símbolos | Uso típico |
|---|---|---|
644 | rw-r--r-- | arquivos comuns |
755 | rwxr-xr-x | programas, scripts e diretórios |
600 | rw------- | arquivos privados (chaves, senhas) |
700 | rwx------ | diretórios privados |
777 | rwxrwxrwx | todos 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
| Comando | Efeito |
|---|---|
chmod u+x script.sh | dá execução ao dono |
chmod go-w notas.txt | tira a gravação do grupo e dos outros |
chmod a+r aviso.txt | dá leitura a todos (a = u, g e o) |
chmod u=rw,g=r,o= rel.txt | define exatamente: o mesmo que 640 |
chmod -R 750 projeto | aplica 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 000tira todas as permissões, até do dono. Como você continua sendo o dono, pode devolvê-las.- Um diretório sem
xnão deixa entrar; semr, não deixa listar. chownmuda o dono de um arquivo, mas só o root pode usá-lo.sudo comandoexecuta um comando como root (pedindo a sua senha). Use apenas quando necessário: como root, nada é negado.
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
| Comando | Para quê | Exemplo |
|---|---|---|
whoami | usuário atual | whoami |
echo | escrever texto | echo "oi" > a.txt |
man | manual | man ls |
pwd | diretório atual | pwd |
cd | mudar de diretório | cd ../Downloads |
ls | listar | ls -lah |
mkdir | criar diretório | mkdir -p a/b/c |
rmdir | remover diretório vazio | rmdir vazio |
touch | criar arquivo vazio | touch a.txt |
| Comando | Para quê | Exemplo |
|---|---|---|
cp | copiar | cp -r fotos backup/ |
mv | mover ou renomear | mv a.txt b.txt |
rm | remover (sem lixeira!) | rm -r pasta |
cat | mostrar ou juntar | cat a b > c |
sort | ordenar linhas | sort -n numeros.txt |
grep | procurar texto | grep -rin erro /var/log |
find | procurar arquivos | find ~ -name "*.pdf" |
chmod | mudar permissões | chmod 755 script.sh |
> >> | | redirecionar e encadear | ls | 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.