Pular para o conteúdo principal

Questão de Sistemas Operacionais — Scripts em Unix e Linux — INSTITUTO AOCP 2024

Sistemas OperacionaisScripts 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.
  1. A# PowerShell Get-ChildItem -Path “C:\MeuDiretorio” | ForEach- Object {Write-Output “((_.Name): ((_.Length)”}   # Shell Script for file in /MeuDiretorio/*; do   echo “(basename(basename “file”): (statc(stat -c%s “file”)” done
  2. B# PowerShell Get-ChildItem -Path “C:\MeuDiretorio” -File | Select-Object Name, Length   # Shell Script ls -l /MeuDiretorio | awk ‘{print $9, $5}’
  3. C# PowerShell Get-ChildItem -Path “C:\MeuDiretorio” | ForEach- Object {Write-Output “((_.FullName): ((_.Length)”}   # Shell Script find /MeuDiretorio -type f -exec stat -c ‘%n: %s’ {}  \;
  4. D# PowerShell Get-ChildItem -Path “C:\MeuDiretorio” | Where- Object { -not $_.PSIsContainer } | ForEach-Object {Write-Output “((_.Name): ((_.Length)”}   # Shell Script for file in $(find /MeuDiretorio -type f); do   echo “(basename(basename “file”): (statc(stat -c%s “file”)” done
  5. E# PowerShell Get-ChildItem -Path “C:\MeuDiretorio” -Recurse | ForEach-Object {Write-Output “((_.Name): ((_.Length)”}   # Shell Script du -a /MeuDiretorio | awk ‘{print $2, $1}’
Revelar gabarito e comentário

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)

1Escopo
Sem recursão (só diretório)
Com recursão (subpastas)
2Dado exibido
Tamanho em bytes (stat -c%s / Length)
Uso de disco (du)
3Formato de saída
"nome: tamanho"
Campos separados (awk)
Equivalência PowerShell × Shell
LEVELsoulevel.com.br
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).

Gabarito: letra A

Link permanente: /questoes/qa632944