Introdução
O Linux organiza os arquivos em uma única árvore de diretórios que começa em /, o diretório raiz. Cada arquivo e diretório tem um caminho que descreve sua localização nessa árvore. Aprender a ler e usar caminhos facilita praticamente todas as tarefas posteriores no Linux.
Neste laboratório, você criará um pequeno espaço de trabalho enquanto aprende operações usadas diariamente no terminal. Você navegará pelos diretórios, criará e editará arquivos, copiará e moverá dados, encontrará arquivos, inspecionará metadados e inodes, experimentará hard links e links simbólicos e comparará arquivos e árvores de diretórios com diff.
Explore a árvore de diretórios do Linux
Nesta etapa, você identificará sua localização atual, inspecionará diretórios importantes do nível superior e criará um espaço de trabalho exclusivo para o restante do laboratório.
O comando pwd significa "print working directory" (imprimir diretório de trabalho). Execute-o primeiro para saber onde o terminal foi iniciado:
pwd
O resultado deve ser /home/labex/project. Um caminho absoluto começa com / e descreve uma localização a partir da raiz do sistema de arquivos.
Liste o nível superior do sistema de arquivos:
ls /
Você verá diretórios padrão, como etc, home, tmp, usr e var. Suas finalidades comuns são:
/etcarmazena configurações de todo o sistema./homearmazena os diretórios pessoais dos usuários comuns./tmparmazena dados temporários./usrcontém muitos programas instalados e recursos compartilhados./varcontém dados que mudam, como logs e caches.
A opção -d instrui o ls a descrever os diretórios informados, em vez de listar o conteúdo deles. A opção -l seleciona o formato longo:
ls -ld /etc /home /tmp /usr /var
O primeiro caractere de cada linha é d, indicando que o objeto é um diretório. As colunas restantes contêm permissões, proprietário, tamanho, horário e nome.
Crie um espaço de trabalho para este laboratório. A opção -p permite que o mkdir crie os diretórios-pai ausentes e evita um erro caso o diretório já exista:
mkdir -p /home/labex/project/file-ops-lab
Entre nele e confirme sua nova localização:
cd /home/labex/project/file-ops-lab
pwd
A saída final deve ser /home/labex/project/file-ops-lab.
Navegue usando caminhos absolutos e relativos
Nesta etapa, você criará uma árvore de diretórios aninhados e navegará por ela usando caminhos absolutos, caminhos relativos e atalhos de navegação.
Comece no espaço de trabalho do laboratório:
cd /home/labex/project/file-ops-lab
Crie três diretórios aninhados com um único comando:
mkdir -p navigation/alpha/beta
Aqui, navigation/alpha/beta é um caminho relativo porque não começa com /. O shell o resolve a partir do diretório atual.
Use um caminho absoluto para entrar no diretório mais profundo:
cd /home/labex/project/file-ops-lab/navigation/alpha/beta
pwd
O caminho especial .. representa o diretório-pai. Vá de beta para alpha:
cd ..
pwd
A saída deve terminar em /navigation/alpha. O comando cd - retorna ao diretório de trabalho anterior:
cd -
pwd
Você deve estar novamente em beta. Por fim, ~ representa seu diretório pessoal. Use-o no início de um caminho para retornar ao espaço de trabalho do laboratório:
cd ~/project/file-ops-lab
pwd
Os caminhos absolutos funcionam a partir de qualquer localização. Os caminhos relativos são mais curtos quando você já sabe qual é sua localização atual.
Crie diretórios e grave arquivos
Nesta etapa, você criará diretórios e arquivos e aprenderá a diferença entre sobrescrever e acrescentar conteúdo usando o redirecionamento do shell.
Comece no espaço de trabalho do laboratório e crie dois diretórios de uma só vez:
cd /home/labex/project/file-ops-lab
mkdir documents archive
O comando touch cria um arquivo vazio quando o arquivo informado não existe:
touch documents/empty.txt
Inspecione o arquivo vazio usando o formato de listagem longa:
ls -l documents/empty.txt
O tamanho deve ser 0 bytes. Em seguida, > redireciona a saída de um comando para um arquivo. Ele cria o arquivo ou substitui o conteúdo anterior:
echo "Linux file practice" > documents/notes.txt
O operador >> acrescenta a saída sem remover o conteúdo existente:
echo "Paths identify each filesystem object" >> documents/notes.txt
Exiba o arquivo completo com cat:
cat documents/notes.txt
Você deve ver duas linhas na ordem original. Use wc -l para contá-las; -l instrui o wc a contar linhas:
wc -l documents/notes.txt
O primeiro campo deve ser 2.
Copie, mova, renomeie e remova arquivos
Nesta etapa, você praticará as quatro formas comuns de alterar objetos do sistema de arquivos: copiar, mover, renomear e remover.
Retorne ao espaço de trabalho do laboratório:
cd /home/labex/project/file-ops-lab
O comando cp copia uma origem para um destino. Copie notes.txt para o arquivo com um novo nome:
cp documents/notes.txt archive/notes-backup.txt
Confirme que a origem e a cópia existem:
ls -l documents/notes.txt archive/notes-backup.txt
Crie um arquivo temporário e use mv para movê-lo e renomeá-lo em uma única operação:
echo "draft" > documents/draft.txt
mv documents/draft.txt archive/final-draft.txt
O caminho antigo não deve mais existir, enquanto o novo caminho deve existir:
ls -l archive/final-draft.txt
Para copiar um diretório e todo o seu conteúdo, use a opção recursiva -r:
cp -r documents archive/documents-copy
find archive/documents-copy -maxdepth 1 -type f
O comando rm remove arquivos permanentemente; o terminal não tem uma lixeira. Crie e remova um arquivo descartável:
touch disposable.tmp
rm disposable.tmp
Liste o diretório atual para confirmar que o caminho desapareceu:
ls
disposable.tmp não deve aparecer. Sempre verifique cuidadosamente um caminho antes de usar rm.
Visualize, atualize e encontre arquivos
Nesta etapa, você criará um arquivo com várias linhas, inspecionará diferentes partes dele, atualizá-lo-á usando o redirecionamento de acréscimo e o encontrará pelo nome.
Retorne ao espaço de trabalho do laboratório. Um here-document envia várias linhas para um comando até que o shell encontre uma linha contendo apenas o marcador escolhido, neste caso EOF:
cd /home/labex/project/file-ops-lab
cat > documents/journal.txt <<'EOF'
First entry: created a workspace
Second entry: practiced paths
Third entry: copied files
EOF
As aspas em 'EOF' impedem que o shell expanda caracteres especiais dentro do documento. Exiba o arquivo com os números das linhas:
nl -ba documents/journal.txt
A opção -ba numera todas as linhas. Use head -n 2 para exibir as duas primeiras linhas e tail -n 1 para exibir a última:
head -n 2 documents/journal.txt
tail -n 1 documents/journal.txt
Acrescente uma quarta entrada. Você usou >> anteriormente; ele adiciona a saída ao final sem substituir as três linhas existentes:
echo "Fourth entry: reviewed the results" >> documents/journal.txt
Verifique o resultado:
tail -n 2 documents/journal.txt
Agora pesquise arquivos de texto no espaço de trabalho. Em find, . significa o diretório atual, -type f limita os resultados a arquivos regulares e -name corresponde a um padrão de nome de arquivo. As aspas impedem que o shell expanda *.txt antes que o find o receba:
find . -type f -name "*.txt"
A saída deve incluir ./documents/journal.txt junto com os outros arquivos de texto que você criou.
Inspecione tipos de arquivo, metadados e inodes
Nesta etapa, você irá além do nome do arquivo e inspecionará as informações que o Linux armazena sobre um objeto do sistema de arquivos.
Comece no espaço de trabalho do laboratório e peça ao file para identificar dois objetos diferentes:
cd /home/labex/project/file-ops-lab
file documents/journal.txt /bin/ls
O diário será identificado como texto, enquanto /bin/ls será identificado como um programa executável. O Linux não depende apenas das extensões dos nomes de arquivo para identificar os dados.
O comando stat exibe metadados como tamanho, permissões, proprietário, marcas de tempo e número do inode:
stat documents/journal.txt
Um inode é o registro do sistema de arquivos que armazena os metadados de um arquivo e aponta para seus dados. Um nome de arquivo é uma entrada de diretório que faz referência a um inode. Use um formato personalizado do stat para exibir campos estáveis:
stat -c 'name=%n type=%F size=%s inode=%i links=%h' documents/journal.txt
O campo %i é o número do inode, enquanto %h é o número de hard links que fazem referência a esse inode.
A opção -i do ls também exibe números de inode. Crie um arquivo para praticar metadados e inspecione-o:
echo "inode practice" > metadata-sample.txt
ls -li metadata-sample.txt
O número no início da linha é o número do inode. Ele pode variar entre ambientes; portanto, concentre-se no que esse campo representa, em vez de memorizar o valor.
Trabalhe com hard links e links simbólicos
Nesta etapa, você criará os dois tipos de links do Linux e observará como cada um se comporta quando o nome do arquivo original é removido.
Crie um diretório e um arquivo de origem para o experimento:
cd /home/labex/project/file-ops-lab
mkdir links
echo "shared inode data" > links/source.txt
O comando ln sem uma opção cria um hard link. Os dois nomes fazem referência ao mesmo inode e aos mesmos dados do arquivo:
ln links/source.txt links/hard-link.txt
A opção -s cria um link simbólico, também chamado de symlink. Um link simbólico armazena o caminho para outro arquivo:
ln -s source.txt links/symbolic-link.txt
Compare os números dos inodes e as informações dos links:
ls -li links
source.txt e hard-link.txt devem ter o mesmo número de inode. O link simbólico tem seu próprio inode e exibe -> source.txt.
Use readlink para exibir o caminho armazenado dentro do link simbólico:
readlink links/symbolic-link.txt
Remova o nome do arquivo original:
rm links/source.txt
O hard link ainda permite acessar o inode e seus dados:
cat links/hard-link.txt
Agora o link simbólico aponta para um nome que não existe mais. Tente lê-lo:
cat links/symbolic-link.txt
O erro No such file or directory é esperado e serve como evidência: o objeto do link continua existindo, mas o caminho de destino armazenado está quebrado. Este experimento mostra por que excluir um nome de hard link não exclui os dados enquanto outro hard link permanecer, ao passo que um link simbólico depende do caminho de destino armazenado.
Compare arquivos e diretórios com diff
Nesta etapa, você usará diff para localizar diferenças e, em seguida, sincronizará duas pequenas árvores de diretórios.
Crie dois diretórios de versão:
cd /home/labex/project/file-ops-lab
mkdir -p comparison/version-a comparison/version-b
Crie arquivos de configuração que diferem em uma linha:
printf 'mode=production\nport=8080\n' > comparison/version-a/app.conf
printf 'mode=production\nport=9090\n' > comparison/version-b/app.conf
A opção -u solicita ao diff uma visualização unificada, com contexto ao redor de cada alteração:
diff -u comparison/version-a/app.conf comparison/version-b/app.conf
O diff marca as linhas do primeiro arquivo com - e as linhas do segundo com +. Seu status de saída diferente de zero significa que os arquivos são diferentes; isso é esperado.
Faça o segundo arquivo ficar igual ao primeiro e use -q para uma verificação silenciosa de igualdade:
cp comparison/version-a/app.conf comparison/version-b/app.conf
diff -q comparison/version-a/app.conf comparison/version-b/app.conf
Nenhuma saída significa que os arquivos são iguais. Agora adicione um arquivo a apenas um dos diretórios:
echo "release notes" > comparison/version-a/README.txt
A opção -r compara recursivamente as árvores de diretórios:
diff -r comparison/version-a comparison/version-b
A saída informa que README.txt existe somente em version-a. Copie-o e compare novamente:
cp comparison/version-a/README.txt comparison/version-b/README.txt
diff -r comparison/version-a comparison/version-b
O comando final não deve produzir nenhuma saída, comprovando que as duas árvores de diretórios agora contêm os mesmos conteúdos de arquivo.
Resumo
Você praticou as principais operações com arquivos e diretórios usadas no terminal Linux. Navegou usando caminhos absolutos e relativos, criou e editou arquivos, copiou e moveu dados, removeu um arquivo descartável com segurança e pesquisou por nome de arquivo.
Você também inspecionou tipos de arquivo e metadados, aprendeu como os nomes de arquivo se relacionam com os inodes, comparou hard links com links simbólicos e usou diff para comparar arquivos individuais e árvores completas de diretórios. Esses conceitos ajudam você a raciocinar sobre arquivos Linux, em vez de tratar os comandos como receitas isoladas.



