Como exibir o tamanho em formato legível por humanos no comando find

2

Estou tentando exibir o tamanho do arquivo em formato legível por humanos no seguinte comando de localização

 find $BASE_DIR/ -user $USER -size +$LOWERSIZELIMIT -mtime +$MY_MTIME -type f -printf      "%s %p\n" 2> /dev/null | 
 sort -nr | 
 head -n $NUMFILES >> $TESTFILE

Minha função para encontrar arquivos grandes se parece com isso. Ele recebe $ 1 como argumento para passar o caminho do diretório base para o comando find.

 function find_files {
 #echo "In find files"
 # $1 = base directory from where to start the search

 find $1/ -user $USER -size +$LOWERSIZELIMIT -mtime +$MY_MTIME -type f -printf "%s %p\n" 2> /dev/null | sort -nr | head -n $NUMFILES >> $TESTFILE

 if [[ -s $TESTFILE ]] ; 
 then 
   echo "***********************************************************************" >> $DUMPFILE
   echo "***********************************************************************" >> $DUMPFILE
   echo "***********************************************************************" >> $DUMPFILE
   echo "***********************************************************************" >> $DUMPFILE
   #cat $TESTFILE
   cat $TESTFILE >> $DUMPFILE
   rm $TESTFILE
   return 0
 else
   return 1
 fi
 }
    
por user199889 18.02.2013 / 21:50

2 respostas

2

Use a opção -exec para encontrar (não se esqueça de terminar com \;) Se você precisar apenas de parte das informações do seu comando exec, analise com awk.

find $BASE_DIR/ -user $USER -size +$LOWERSIZELIMIT -mtime +$MY_MTIME -type f -exec /bin/ls -hl {} \;

Use outro comando se você não quiser uma saída legível por humanos de ls, ou awk como assim

find $BASE_DIR/ -user $USER -size +$LOWERSIZELIMIT -mtime +$MY_MTIME -type f -exec /bin/ls -hl {} \; | awk '{ print $5,$9 }'

As partes mais difíceis do exec de find estão usando {} como o item de resultado para o que é encontrado, e o comando deve terminar em \; Se você tiver uma cadeia de comandos na mesma linha separada por; Você precisará terminar seu achado e então adicionar um; então tem 2, tipo     algum comando; encontre $ BASE_DIR / -user $ USER -size + $ LOWERSIZELIMIT -mtime + $ MY_MTIME -tipo f -exec / bin / ls -hl {} \ ;; algum comando;

    
por 18.02.2013 / 22:46
2

A sutileza aqui é sort , você não pode (facilmente & corretamente) classificar números legíveis por humanos (a menos que você tenha sort de GNU coreutils > = 7.5, ele suporta a opção -h , por exemplo, du -h | sort -h ).

Salve o seguinte em hr.awk :

BEGIN { split("KMGTPEZY",suff,//)}
{
  match($0,/([0-9]+)[ \t](.*)/,bits)
  sz=bits[1]+0; fn=bits[2]
  i=0; while ((sz>1024)&&(i<length(suff))) { sz/=1024;i++ }
  if (i) printf("%.3f %siB %s\n",sz,suff[i],fn)
  else   printf("%3i B %s\n",sz,fn)
}

Então você pode fazer:

find $BASE_DIR/ -user $USER -size +$LOWERSIZELIMIT -mtime +$MY_MTIME \
  -type f -printf "%s %p\n" 2> /dev/null | sort -nr |
  gawk -f hr.awk | head -n $NUMFILES >> $TESTFILE

O script gawk aceita find ... -printf "%s %p\n" como entrada e converte o primeiro campo em tamanho legível por humanos com sufixo (em unidades IEC 2 10 ).

Veja também esta pergunta popular: link

    
por 18.02.2013 / 23:36

Tags