Questão de Sistemas Operacionais — Scripts em Unix e Linux — INSTITUTO AOCP 2024
Sistemas Operacionais›Scripts em Unix e Linux
Código
qa632944
Banca
INSTITUTO AOCP
Órgão
TRF 2
Ano
2024
Cargo
TJ TRF2
Considere os seguintes trechos de código em PowerShell e shell script que têm como objetivo listar todos os arquivos em um diretório e exibir seu tamanho em bytes. Assinale a alternativa que apresenta corretamente os códigos que sejam equivalentes em PowerShell e shell script.
A# PowerShell Get-ChildItem -Path “C:\MeuDiretorio” | ForEach- Object {Write-Output “(_.Name): (_.Length)”} # Shell Script for file in /MeuDiretorio/*; do echo “(basename“file”):(stat−cfile”)” done
GabaritoA — # PowerShell
Get-ChildItem -Path “C:\MeuDiretorio” | ForEach-
Object {Write-Output “$($_.Name): $($_.Length)”}
# Shell Script
for file in /MeuDiretorio/*; do
echo “$(basename “$file”):
$(stat -c%s “$file”)”
done
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Equivalência entre PowerShell e Shell Script para listar arquivos e tamanhos
Gabarito: letra A. A alternativa A é a única em que os dois trechos são funcionalmente equivalentes: ambos listam apenas os arquivos do diretório (sem subdiretórios), exibem o nome e o tamanho em bytes, e usam a mesma lógica de iteração — Get-ChildItem com ForEach-Object no PowerShell e o laço for com stat -c%s no shell. As demais alternativas falham por diferenças sutis, como incluir diretórios, usar recursão, ou exibir campos diferentes.
O objetivo do enunciado é testar se o candidato reconhece a equivalência semântica entre os dois ambientes, não apenas a sintaxe. No PowerShell, Get-ChildItem -Path lista os itens do diretório; sem o parâmetro -Recurse, ele não desce para subpastas. A propriedade Length de um objeto FileInfo retorna o tamanho em bytes. No shell, o laço for file in /MeuDiretorio/* expande o glob para listar os itens do diretório (sem recursão), e stat -c%s retorna o tamanho em bytes. Ambos produzem a mesma saída: nome do arquivo, dois-pontos, espaço e o tamanho em bytes.
A pegadinha central está em distinguir o que cada comando realmente faz. Get-ChildItem sem -File retorna também diretórios; -Recurse inclui subdiretórios; Where-Object { -not $_.PSIsContainer } filtra diretórios, mas o equivalente no shell com find -type f é recursivo por padrão. No shell, ls -l não mostra o tamanho em bytes de forma confiável (mostra em blocos ou com -h), e du -a mostra o uso de disco, não o tamanho do arquivo. A alternativa A é a única em que ambos os lados fazem exatamente a mesma coisa: iterar sobre os itens do diretório, pegar o nome e o tamanho em bytes, e imprimir.
Para fixar: a equivalência exige que os dois lados tenham o mesmo escopo (arquivos do diretório, sem recursão), o mesmo dado (nome e tamanho em bytes) e o mesmo formato de saída. Qualquer diferença nesses três pontos quebra a equivalência.
Critério
Alternativa A (✅)
Alternativa B (❌)
Alternativa C (❌)
Alternativa D (❌)
Alternativa E (❌)
Escopo (arquivos do diretório, sem recursão)
✅ Ambos sem recursão
❌ Shell inclui diretórios
❌ Shell usa find recursivo
❌ Shell usa find recursivo
❌ Ambos recursivos
Dado exibido (nome e tamanho em bytes)
✅ Ambos corretos
❌ Shell usa ls -l (tamanho em blocos)
✅ Ambos corretos
✅ Ambos corretos
❌ Shell usa du (uso de disco)
Formato de saída (nome: tamanho)
✅ Ambos idênticos
❌ Shell usa awk (campos separados)
✅ Ambos idênticos
✅ Ambos idênticos
❌ Shell usa awk (ordem invertida)
Equivalência PowerShell × Shell: Escopo (Sem recursão (só diretório), Com recursão (subpastas)); Dado exibido (Tamanho em bytes (stat -c%s / Length), Uso de disco (du)); Formato de saída ("nome: tamanho", Campos separados (awk))
Alternativa A — ✅ Correta ⟵ GABARITO
O PowerShell usa Get-ChildItem -Path (sem -Recurse), que lista os itens do diretório — incluindo subdiretórios, mas o ForEach-Object imprime $_.Name e $_.Length para todos os itens. O shell usa for file in /MeuDiretorio/*, que expande o glob para listar os itens do diretório, e stat -c%s retorna o tamanho em bytes. Ambos produzem a mesma saída: nome do arquivo, dois-pontos, espaço e o tamanho em bytes. A equivalência é perfeita: mesmo escopo (itens do diretório), mesmo dado (nome e tamanho em bytes), mesmo formato.
Alternativa B — ❌ Incorreta
O PowerShell usa -File, que filtra apenas arquivos (exclui diretórios). O shell usa ls -l | awk '{print $9, $5}', que lista todos os itens (incluindo diretórios) e extrai o nome (campo 9) e o tamanho (campo 5). O ls -l não mostra o tamanho em bytes de forma confiável — o campo 5 é o tamanho em bytes, mas o ls -l também lista diretórios, então o escopo é diferente. Além disso, o awk imprime os campos separados por espaço, sem o formato "nome: tamanho" do PowerShell. A equivalência falha no escopo (diretórios incluídos no shell) e no formato de saída.
Alternativa C — ❌ Incorreta
O PowerShell usa $_.FullName, que exibe o caminho completo do arquivo, enquanto o shell usa find /MeuDiretorio -type f -exec stat -c '%n: %s' {} \;, que também exibe o caminho completo (porque o find retorna caminhos completos). Apesar de ambos exibirem o caminho completo, o PowerShell sem -Recurse lista apenas os itens do diretório, enquanto o find é recursivo por padrão — ele desce para subdiretórios. Portanto, o escopo é diferente: o PowerShell lista apenas os arquivos do diretório, o find lista todos os arquivos da árvore. A equivalência falha no escopo.
Alternativa D — ❌ Incorreta
O PowerShell usa Where-Object { -not $_.PSIsContainer }, que filtra diretórios, e ForEach-Object imprime $_.Name e $_.Length. O shell usa for file in $(find /MeuDiretorio -type f), que é recursivo — lista todos os arquivos da árvore, não apenas do diretório. O PowerShell sem -Recurse lista apenas os itens do diretório. Portanto, o escopo é diferente: o PowerShell lista apenas os arquivos do diretório, o find lista todos os arquivos da árvore. A equivalência falha no escopo.
Alternativa E — ❌ Incorreta
O PowerShell usa -Recurse, que lista todos os arquivos e subdiretórios da árvore. O shell usa du -a /MeuDiretorio | awk '{print $2, $1}', que mostra o uso de disco de cada item (em blocos de 1K, por padrão), não o tamanho do arquivo em bytes. Além disso, o du -a também lista diretórios. A equivalência falha no dado (tamanho em bytes vs. uso de disco) e no escopo (recursão vs. não-recursão).