Filesize no loop for

1

Eu estou tentando obter o tamanho do arquivo de cada arquivo em uma pasta usando stat em um loop for. Eu sei porque o seguinte está dando errado, mas ainda não tenho conhecimento suficiente sobre como consertar isso.

#!/bin/bash

for file in .* *; do
     size=$(stat --printf="%s")
     echo $size
done

No entanto, como stat está faltando o nome do arquivo, eu logicamente recebo o seguinte erro:

stat: missing operand
Try 'stat --help' for more information.

Como faço para garantir que o stat obtenha o nome do arquivo de cada arquivo ( somente arquivos ) na pasta?

EDIT: Vindo de um fundo Powershell, eu usaria a variável '$ _'. O shell Unix oferece uma variável semelhante?

    
por ses 26.07.2015 / 22:37

1 resposta

0

Você não está dando nenhum argumento (nome de arquivo) para stat que levou a esse erro.

Você está usando a variável file para armazenar cada nome de arquivo e fazer um loop sobre eles, mas você não está dando os nomes de arquivos como argumentos para stat . Em suma, você precisa passar $file (o valor da variável file ) para stat .

Você também pode fazer tudo o que estiver fazendo em uma linha:

for file in .* *; do stat -c '%s-%n' "$file" ; done

Se você insistir na saída formatada com printf , precisará de um \n extra:

for file in .* *; do stat --printf='%s-%n\n' "$file" ; done

Aqui eu também adicionei %n para que você possa saber qual o tamanho do arquivo que está sendo mostrado.

EDITAR:

Se você deseja executar isso apenas em arquivos, excluindo diretórios, é necessário usar uma verificação adicional. Aqui eu usei test ( [ ) embutido para verificar se file é um arquivo regular, se assim for [ -f "$file" ] retorna o código de saída 0 então ( && ) executa stat no arquivo:

for file in .* *; do [ -f "$file" ] && stat -c '%s-%n' "$file" ; done
    
por 26.07.2015 / 22:46