Introdução
A Field Notes está preparando um fim de semana comunitário. O pacote de recursos contém um guia em PDF, materiais de apoio e um arquivo opcional de agradecimentos que pode estar vazio. Um nome de arquivo e um tamanho plausível não comprovam que um download está completo. Antes de buscar qualquer coisa, você criará um inventário que mostrará à organização exatamente quais arquivos precisam de atenção.
Você deve conhecer os argumentos, as condições e os laços básicos de Bash apresentados em Shell for Beginners. Este laboratório explica SHA256, a leitura de linhas completas e a classificação usada aqui. As ferramentas e os recursos sintéticos originais estão preparados. Workspace e Download Desk compartilham um contêiner; este laboratório começa de forma independente. O tempo estimado inclui leitura e correção de erros comuns de digitação.
Crie um inventário fundamentado
Nesta etapa, você transformará uma lista de verificação confiável em um inventário do pacote local real, sem reparar nem reescrever nenhum arquivo do pacote.
Primeiro, veja um arquivo útil
Comece em Workspace, preparado para texto UTF-8. Seu diretório de trabalho é /home/labex/project/download-desk. pwd mostra o diretório atual. Se um caminho relativo não for encontrado, confira com ls e volte para cá com o comando cd completo abaixo.
cd /home/labex/project/download-desk
ls pack
Mude para Download Desk. Selecione Open file ao lado de Welcome guide.pdf. A nova página do navegador deve mostrar a programação do evento e o ponto de encontro na entrada leste. Use o zoom do leitor de PDF se necessário: um PDF tem páginas fixas, não um leiaute móvel que reorganiza o texto. Volte à página Download Desk e selecione Download ao lado do arquivo para salvar os mesmos bytes locais. Depois, volte para Workspace.

Use Open file ou Download ao lado de Welcome guide.pdf.
Este leitor serve apenas os arquivos realmente presentes em pack. Ele não pode completar um arquivo ausente usando a origem. Um recurso de texto pode aparecer como texto, e o arquivo vazio opcional como uma página em branco. Essas observações, por si só, não comprovam a correção do conteúdo.
Use uma referência independente
A organização forneceu /opt/labex/download-pack-state/expected.sha256 separadamente do pacote gravável. Um hash SHA256 é uma impressão digital de 64 caracteres dos bytes de um arquivo. Compará-lo com um valor independente e confiável detecta diferenças de bytes, incluindo danos que não alteram o tamanho. Isso não autentica a identidade de quem publica: se um invasor fornecer tanto o arquivo quanto a soma de verificação, a correspondência não torna esse publicador confiável. Não recrie a referência a partir dos arquivos que está verificando.
cat exibe um arquivo sem alterá-lo:
cat /opt/labex/download-pack-state/expected.sha256
Cada linha contém um hash hexadecimal de 64 caracteres em minúsculas, dois espaços e o nome completo do arquivo. Este curso usa um manifesto fornecido, legível, não vazio e terminado por uma quebra de linha, exatamente nesse formato. Os nomes não incluem níveis de diretórios, usam ASCII imprimível e podem conter espaços. Barras, barras invertidas, CR, LF, tabulações e os nomes . e .. estão fora do escopo. O pacote e toda a sua cadeia de diretórios são diretórios reais; os membros listados são arquivos locais regulares ou estão ausentes. Arquivos vinculados por links, subdiretórios no lugar de arquivos esperados e formatos arbitrários de somas com escapes não são suportados. Deixe todos os arquivos originais do pacote e notes.txt inalterados neste laboratório de diagnóstico.
sha256sum imprime o hash e o nome do arquivo. Aspas duplas mantêm um nome com espaços como um único argumento. -- encerra as opções do comando. O prefixo do diretório também impede que um nome base começando com - seja interpretado como opção.
sha256sum -- "pack/Workshop card.txt"
Compare esse hash com a linha de referência. Eles são diferentes. O arquivo danificado tem a mesma quantidade de bytes que o material correto; portanto, o tamanho não revelaria o problema.
sha256sum --check lê o manifesto e verifica seus caminhos em relação ao diretório atual. Parênteses executam comandos em um subshell: seu cd não altera o diretório do terminal externo.
(cd pack && sha256sum --check /opt/labex/download-pack-state/expected.sha256)
Aqui, && executa a verificação somente se a mudança para pack for bem-sucedida. Você deve ver Welcome guide.pdf: OK, Workshop card.txt: FAILED, Map notes.txt: FAILED open or read e Optional credits.txt: OK, além de avisos. Esse comando falha intencionalmente por causa do arquivo ausente e dos bytes incorretos. $? contém o status de saída nativo do comando anterior; leia-o imediatamente, antes que outro comando substitua o valor. printf formata o valor, e \n termina a linha.
printf 'Check exit: %s\n' "$?"
O esperado é Check exit: 1. O arquivo de agradecimentos de zero bytes é válido porque seu hash corresponde. “Não vazio” é um requisito do manifesto, não de todos os recursos. Uma única linha OK não torna o pacote inteiro correto.
Preserve os nomes ao ler linhas
A organização precisa de um inventário compacto com um status e um nome completo por linha, na ordem do manifesto. Você criará inventory.sh, que recebe o manifesto como $1 e o diretório do pacote como $2. É um programa independente que usa esses argumentos e os comandos instalados, sem depender de arquivos auxiliares vizinhos.
Antes de escrever, entenda a sintaxe do shell:
while IFS= read -r linelê uma linha completa a cada iteração. UmIFSvazio impede a remoção de espaços;-rimpede a interpretação de barras invertidas.done < "$manifest"redireciona o manifesto para o laço em vez de solicitar entrada do terminal.${line:0:64}extrai o hash das posições de caracteres 0 a 63.${line:66}extrai tudo após os dois espaços separadores. O nome do arquivo não é dividido em palavras.[ -f "$target" ]verifica se o alvo suportado é um arquivo regular. Um membro ausente é classificado antes de qualquer comando de soma de verificação.actual=$(sha256sum -- "$target")captura a saída do comando.${actual%% *}remove o maior sufixo correspondente a um espaço e qualquer texto seguinte, deixando o hash. Isso é seguro para o formato controlado de nomes descrito acima.printf '%s\t%s\n'escreve dois valores separados por uma tabulação, com uma quebra de linha no final. As aspas preservam cada nome completo como um argumento.
O here-document abaixo salva texto literal em um script. cat > inventory.sh substitui esse arquivo de script; <<'BASH' termina em uma linha contendo apenas BASH. As aspas no delimitador impedem que o shell atual expanda as variáveis do script durante o salvamento. A primeira linha identifica o Bash; aqui executamos o arquivo explicitamente com bash.
cat > inventory.sh <<'BASH'
#!/usr/bin/env bash
manifest=$1
pack=$2
while IFS= read -r line; do
expected=${line:0:64}
name=${line:66}
target=$pack/$name
status=MISSING
if [ -f "$target" ]; then
actual=$(sha256sum -- "$target")
actual=${actual%% *}
status=MISMATCH
if [ "$actual" = "$expected" ]; then
status=MATCH
fi
fi
printf '%s\t%s\n' "$status" "$name"
done < "$manifest"
BASH
Execute o script com a referência fornecida e o pacote local. > redireciona sua saída padrão para inventory.tsv, substituindo esse relatório a cada execução. TSV significa valores separados por tabulações. Esse relatório é o resultado diagnóstico para a organização; ele não repara os recursos.
bash inventory.sh /opt/labex/download-pack-state/expected.sha256 pack > inventory.tsv
cat inventory.tsv
Espere as seguintes linhas, com uma tabulação entre cada status e nome:
MATCH Welcome guide.pdf
MISMATCH Workshop card.txt
MISSING Map notes.txt
MATCH Optional credits.txt
O script pode terminar com status zero mesmo que o relatório contenha MISSING: seu objetivo é classificar, não afirmar que o pacote está completo. A correção do relatório vem da relação com os arquivos reais e a referência confiável. A verificação também testa seu script em outro pacote, com nomes diferentes e um arquivo vazio; esta grafia exata do laço não é obrigatória.
Se digitar uma linha do script incorretamente, repita o here-document completo para substituir apenas inventory.sh e gere o relatório novamente. Se estiver trabalhando em pack por engano, volte com o cd absoluto acima. Não altere pack, a referência confiável nem notes.txt. Uma nova execução deve produzir o mesmo relatório, pois apenas lê o pacote. No próximo laboratório, você usará essas categorias para decidir o que baixar.
Resumo
Você abriu um recurso real, comparou o pacote com uma referência SHA256 independente e criou um inventário em Bash que preserva linhas completas. Você distinguiu arquivos ausentes, bytes incorretos e arquivos vazios válidos sem alterar o pacote original. O inventário agora oferece uma justificativa para cada reparo posterior.



