Como posso usar o find para selecionar usuários com certa quantidade de espaço em disco?

6

Desejo localizar todos os usuários mostrados no diretório /home/ cujo consumo de disco é superior a 500 MB. O seguinte comando funciona conforme o esperado.

cd /home/ && du */ -hs
68K     ajay/
902M    john/
250M    websites/

No exemplo acima, somente 902M john/ deve ser retornado.

Como posso fazer com que o comando find exiba os mesmos resultados?

    
por shantanuo 16.05.2011 / 08:34

4 respostas

0

Você não pode fazer isso apenas com o find, porque encontra ações em arquivos individuais e não tem o conceito de adicionar tamanhos de arquivo. Você poderia canalizar a saída do find em outra ferramenta, mas por que se incomodar quando faz a maior parte do trabalho?

du -sm */ | sort -k1,1n | awk '$1 > 500 { sub(/$/, "M", $1); print $0 }'

O teste do awk se torna confuso quando o sufixo "human-readable" é incluído na entrada, porque você precisa remover o "M" à direita para fazer uma comparação inteira. Para a saída, pessoalmente, eu pularia o sufixo "M", mas foi o que foi solicitado.

    
por 23.05.2011 / 18:38
4

Não sei por que você quer algo como find , então aqui está um scriptlet que faz o que você pergunta em bash (mas não funciona como encontrar):

max_size=$((500*1024))
cd /home/ && du -ks */ | while read size user ; do
  if [ $size -gt $max_size ] ; then
    echo "${user%/} exceeds quota"
  fi
done

Exemplo: (com um tamanho menor):

$ du -sk */
2948    a/
4       a b/
640     b/
48      qt/

$ du -ks */ | while read size user ; do if [ $size -gt 600 ] ; then echo "${user%/} exceeds quota" ; fi ; done
a exceeds quota
b exceeds quota

O ${user%/} apenas remove a barra final por mais beleza.

    
por 16.05.2011 / 09:20
0

Isso imprimirá o uso do disco (em kb) para os arquivos de cada usuário em dir , independentemente de onde esses arquivos estiverem:

find dir -printf "%u %b\n" | perl -n -e '@l = split; $sum{$l[0]} += $l[1]; END { foreach(sort(keys(%sum))) { print "$_ ",$sum{$_}/2," KiB\n"; }}'

O comando find imprime o proprietário e a contagem de blocos de cada arquivo e diretório em dir . O comando perl adiciona o uso em um hash codificado no nome de usuário, criando assim uma soma dos tamanhos de arquivo de cada usuário; e depois o conteúdo do hash é impresso.

    
por 20.05.2011 / 18:57
0

Como resposta como resposta.

Eu usei du -ms para obter resultados consistentes que podem ser processados pelo awk sem intervenção adicional. Você está correto que a saída legível é melhor, então a saída final é processada novamente para isso.

#!/bin/bash

######################################################################
#  AUTHOR: Joe Negron - LOGIC Wizards ~ NYC
#  LICENSE: BuyMe-a-Drinkware: Dual BSD or GPL (pick one)
#  USAGE: byteMe (bytes)
#  ABSTRACT: Converts a numeric parameter to a human readable format.
#  URL: http://www.logicwizards.net/2010/10/19/byteme-a-simple-binary-metrics-bash-script-howto-convert-bytes-into-kb-mb-gb-etc-using-bash-bc/
######################################################################
function byteMe() { # Divides by 2^10 until < 1024 and then append metric suffix
declare -a METRIC=('B' 'KB' 'MB' 'GB' 'TB' 'XB' 'PB') # Array of suffixes
MAGNITUDE=0  # magnitude of 2^10
PRECISION="scale=1" # change this numeric value to inrease decimal precision
UNITS='echo $1 | tr -d ',''  # numeric arg val (in bytes) to be converted
while [ ${UNITS/.*} -ge 1024 ] # compares integers (b/c no floats in bash)
  do
   UNITS='echo "$PRECISION; $UNITS/1024" | bc' # floating point math via 'bc'
   ((MAGNITUDE++)) # increments counter for array pointer
  done
echo -n "$UNITS${METRIC[$MAGNITUDE]}"
}

cd /home/ && du */ -bs | awk '$1 > 500 { print $0 }' | while read LINE; do
    SIZE=$(echo "$LINE" | cut -f 1)
    HRSIZE=$(byteMe "$SIZE")
    DIR=$(echo "$LINE" | cut -f 2)
    printf "%8s %s\n" "$HRSIZE" "$DIR"
done

Notas:

  1. A função bash foi encontrada pesquisando (veja os comentários)
  2. Eu mudei du -ms para du -bs , tornando possível usar a função de conversão que aceita bytes.
  3. O limite de 500 MB ainda está codificado. Sinta-se à vontade para modificar o script para aceitá-lo como argumento.
por 24.05.2011 / 04:10