como obter informações de arquivos de diretório

1

Eu tenho a necessidade de obter informações sobre um diretório específico, basicamente eu preciso saber a correlação entre arquivos pequenos, médios e grandes.

Eu inventei isso:

for i in K M G; do
  printf $i
  du -h /usr/opt |
    awk '{print $1}' |
    grep ${i}$ |
    wc -l
done | tee /stat.out

do resultado, então eu adiciono todos os números e subtraio o total para obter o número de arquivos abaixo de 1k. (Eu presumo que temos muitos deles desde que é arquivos de origem)

De qualquer forma, este caminho é bom para diretórios pequenos, eu realmente tenho um muito grande (esperando por 1Tera) e nenhuma idéia da distribuição de arquivos. Eu preciso copiar todos esses arquivos para um armazenamento privado e preciso dar um tempo estimado na cópia.

Eu estava pensando na linha de fazer algo assim:

find pwd |xargs ls -lph |awk '{print $5}' 

Mas eu sinto falta do que devo colocar depois ou se devo fazer outra abordagem.

    
por BitsOfNix 19.02.2013 / 15:55

2 respostas

0

Se você pode usar o GNU find (Linux ou Cygwin não integrado), faça find imprimir os tamanhos dos arquivos e pós-processe a saída com awk para classificar cada tamanho em uma categoria, sort e uniq para agrupar por categorias e awk ou sed para imprimir um resultado bonito. Algo como:

find /usr/opt -type f -printf '%s\n' |
awk '{
    if ($1 ~ /^[2-9]......../) { print "3 G" }
    else if ($1 >= 1073741824) {  print "3 G" }
    else if ($1 >= 1048576) { print "2 M" }
    else if ($1 >= 1024) { print "1 k" }
    else if ($1 >= 1) { print "0" }
}' |
sort | uniq -c |
awk '{print $1 " files are in the " $3 "B range"}'
    
por 20.02.2013 / 23:33
0

O melhor que eu encontrei foi recorrer a um script awk.

{
if ( substr( $5, length($5), length($5) ) == "K" ) {
        totK++;
        totKsize = totKsize + substr($5, 0, length($5) - 1 );}
else if ( substr( $5, length($5), length($5) ) == "M" ) {
        totM++;
        totMsize = totMsize + substr($5, 0, length($5) - 1 );}
else if ( substr( $5, length($5), length($5) ) == "G" ) {
        totG++;
        totGsize = totGsize + substr($5, 0, length($5) - 1 );}
else  {
        totB++;
        totBsize=totBsize + $5; }
}
END{
print "NR of files less than 1k => " totB " total " totBsize;
print "NR of files less than 1M => " totK " total " totKsize;
print "NR of files less than 1G => " totM " total " totMsize;
print "NR of files bigger than 1G => " totG " total " totGsize;
}

E execute o passe assim:

find . -type f |xargs ls -lh |/usr/xpg4/bin/awk -f count_files.awk
    
por 20.02.2013 / 13:14