2

Я пытаюсь отобразить размер фильма в удобочитаемом формате в следующей команде поиска

 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

Моя функция поиска больших файлов выглядит следующим образом. В качестве аргумента требуется $ 1, чтобы передать путь к основному каталогу команде 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
 }

2 ответа2

2

Используйте параметр -exec для поиска (не забудьте завершить \;) Если вам требуется только часть информации от вашей команды exec, проанализируйте с помощью awk.

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

Используйте другую команду, если вы не хотите, чтобы человек читал ls, или awk, например, так

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

Самые хитрые части exec для поиска используют {} в качестве элемента результата для того, что найдено, и команда должна заканчиваться на \; Если у вас есть цепочка команд в той же строке, разделенных с; Вам нужно будет закончить поиск, а затем добавить; так что есть 2, как некоторые команды; find $ BASE_DIR/ -user $ USER -size +$ LOWERSIZELIMIT -mtime +$ MY_MTIME -type f -exec / bin / ls -hl {} \;; какая-то команда;

2

Тонкость здесь заключается в sort : вы не можете (легко и правильно) сортировать удобочитаемые числа (если у вас нет sort из GNU coreutils > = 7.5, она поддерживает опцию -h , например, du -h | sort -h).

Сохраните следующее в 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)
}

Тогда вы можете сделать:

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

Сценарий gawk принимает find ... -printf "%s %p\n" качестве входных данных и преобразует первое поле в читаемый человеком размер с суффиксом (в стандарте IEC 2 10 ).

Смотрите также этот популярный вопрос: https://serverfault.com/questions/62411/how-can-i-sort-du-h-output-by-size

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .