Eu tenho um script que verifica o tamanho 0, mas achei que deveria haver uma maneira mais fácil de verificar o tamanho dos arquivos. Ou seja, file.txt
é normalmente 100k; como fazer um script verificar se é menor que 90k (incluindo 0) e fazer uma nova cópia porque o arquivo está corrompido nesse caso.
O que estou usando atualmente ..
if [ -n file.txt ]
then
echo "everything is good"
else
mail -s "file.txt size is zero, please fix. " myemail@gmail.com < /dev/null
# Grab wget as a fallback
wget -c https://www.server.org/file.txt -P /root/tmp --output-document=/root/tmp/file.txt
mv -f /root/tmp/file.txt /var/www/file.txt
fi
Respostas:
[ -n file.txt ]
não verifica seu tamanho, verifica se a sequênciafile.txt
tem um comprimento diferente de zero e, portanto, sempre será bem-sucedida.Se você quiser dizer "o tamanho é diferente de zero", é necessário
[ -s file.txt ]
.Para obter o tamanho de um arquivo, você pode usá
wc -c
-lo para obter o tamanho (tamanho do arquivo) em bytes:Nesse caso, parece que é isso que você deseja.
Mas, para sua informação, se você quiser saber quanto espaço em disco o arquivo está usando, poderá
du -k
obter o tamanho (espaço em disco usado) em kilobytes:Se você precisar de mais controle sobre o formato de saída, também poderá ver
stat
. No Linux, você começaria com algo comostat -c '%s' file.txt
, e no BSD / Mac OS X, algo comostat -f '%z' file.txt
.fonte
du -b "$file" | cut -f 1
invés destat -c '%s' "$file"
? Oustat --printf="%s" "$file"
?stat
têm sinalizadores diferentes.... | cut -d' ' -f1
para fazê-lo funcionar no Ubuntu.wc -c < "$file"
(observe o<
), caso em que você não precisa da| cut ...
peça (que, conforme publicada, não funciona no OSX). OBLOCKSIZE
valor mínimo paradu
no OSX é512
.wc -c <filename
também usafstat
eseek
? Observe quefstat
leva um fd, não um nome de caminho.Surpreende-me que ninguém tenha mencionado
stat
o tamanho do arquivo. Alguns métodos são definitivamente melhores: usar-s
para descobrir se o arquivo está vazio ou não é mais fácil do que qualquer outra coisa, se é tudo o que você deseja. E se você deseja encontrar arquivos de um tamanho,find
certamente é o caminho a percorrer.Também gosto
du
muito de obter o tamanho do arquivo em kb, mas, para bytes, eu usariastat
:fonte
stat
é uma ótima idéia, mas no CentOS foi isso que funcionou para mim: #size=$(stat -c%s $filename)
stat
a coisa certa em algumas situações, e arquivos esparsos não são relevantes na maioria das situações, embora certamente não todos.solução alternativa com awk e parêntese duplo:
fonte
du
não suporta-b
. (Pode ser uma escolha de estilo consciente, mas apenas para mencionar a alternativa: você pode omitir o$
interior prefixo(( ... ))
ao fazer referência a variáveis:((SIZE<90000))
)$
awk
usandoread
(bash
comando interno):read SIZE _ <<<$(du -sb "$FILENAME")
Se você
find
lida com essa sintaxe, você pode usá-la:Isso resultará
file.txt
em stdout se e somente se o tamanho defile.txt
for menor que 90k. Para executar um scriptscript
sefile.txt
tiver um tamanho menor que 90k:fonte
find . -maxdepth 1 -name "file.txt" -size -90k
Se você está procurando apenas o tamanho de um arquivo:
fonte
wc -c "$file"
foi dada como resposta em 2011 (três anos atrás). Sim,wc -c "$file"
tem o problema de exibir o nome do arquivo e a contagem de caracteres; portanto, as respostas anteriores adicionaram um comando para separar a contagem. Maswc -c < "$file"
, que corrige esse problema, foi adicionado como comentário em maio de 2014. Sua resposta é equivalente a isso, exceto que ela adiciona um "uso inútil decat
" . Além disso, você deve citar todas as referências de variáveis do shell, a menos que tenha um bom motivo para não fazê-lo.Isso funciona tanto em linux quanto em macos
fonte
O stat parece fazer isso com o menor número de chamadas do sistema:
fonte
strace du --bytes $1 2>&1 >/dev/null | wc
Se for esse o caso, então em amd64 arquitetura no ArchLinux (versões mais recentes geralmente de tudo) Eu tenho 45 linhas paradu
, 46 linhas parastat
, 47 linhas parawc
e 72 linhas parafind
.portátil, todos os tipos de python, evita variação nos dialetos estatísticos
fonte
Para obter o tamanho do arquivo no Linux e no Mac OS X (e provavelmente em outros BSDs), não há muitas opções, e a maioria das sugeridas aqui funcionará apenas em um sistema.
Dado
f=/path/to/your/file
,o que funciona no Linux e no Mac 's Bash:
ou
As outras respostas funcionam bem no Linux, mas não no Mac:
du
não tem uma-b
opção no Mac e o truque BLOCKSIZE = 1 não funciona ("o tamanho mínimo do bloco é 512", o que leva a um resultado errado)cut -d' ' -f1
não funciona porque no Mac, o número pode estar alinhado à direita, preenchido com espaços à frente.Então, se você precisa de algo flexível, ou é
perl
's-s
operador ouwc -c
canalizada paraawk '{print $1}'
(awk irá ignorar o espaço em branco à esquerda).E, é claro, com relação ao restante da sua pergunta original, use o operador
-lt
(ou-gt
):if [ $size -lt $your_wanted_size ]; then
etc.fonte
size=$(wc -c < "$f")
(observe o<
que fazwc
com que apenas relate um número). Re comparação: não se esqueça do mais "bash-ful"if (( size < your_wanted_size )); then ...
(e também[[ $size -lt $your_wanted_size ]]
).Com base na resposta de gniourf_gniourf,
vai escrever
file.txt
para stdout se e somente se o tamanhofile.txt
é menor que 90K, eexecutará o comando
command
sefile.txt
tiver um tamanho menor que 90K. Eu testei isso no Linux. Defind(1)
,(enfase adicionada).
fonte
assumindo que o comando ls reporte o tamanho do arquivo na coluna 6
fonte
Gostaria de usar
du
's--threshold
para isso. Não tenho certeza se esta opção está disponível em todas as versões,du
mas está implementada na versão do GNU.Citando o manual do du (1) :
Aqui está a minha solução, usando
du --threshold=
para o caso de uso do OP:A vantagem de que, é que
du
pode aceitar um argumento para essa opção em um formato conhecido - tanto humana como em10K
,10MiB
ou o que nunca você se sinta confortável - você não precisa converter manualmente entre formatos / unidades desdedu
alças que.Para referência, aqui está a explicação sobre esse
SIZE
argumento na página de manual:fonte
du
que não são compatíveis. A--threshold
opção foi adicionada no coreutils 8.21, lançado em 2013 .Ok, se você estiver em um Mac, faça o seguinte:
stat -f %z "/Users/Example/config.log"
É isso!fonte