Как проверить текущую политику планирования, работающую во встроенном Linux?

Объединение find и awk позволяет средние значения также должны быть вычислены:

find . -type f -printf '%s %h/%f\0'|awk 'BEGIN { RS="\0" } { SIZE=$1; for (i = 1; i <= NF - 1; i++) $i = $(i + 1); NF = NF - 1; DIR=$0; gsub("/[^/]+$", "", DIR); FILE=substr($0, length(DIR) + 2); SUMSIZES[DIR] += SIZE; NBFILES[DIR]++; if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) { MAXSIZE[DIR] = SIZE; BIGGESTFILE[DIR] = FILE } }; END { for (DIR in SUMSIZES) { printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR] } }'

Сценарий AWK, изложенный более читаемым образом, имеет вид

BEGIN { RS="\0" }

{
  SIZE=$1
  for (i = 1; i <= NF - 1; i++) $i = $(i + 1)
  NF = NF - 1
  DIR=$0
  gsub("/[^/]+$", "", DIR)
  FILE=substr($0, length(DIR) + 2)
  SUMSIZES[DIR] += SIZE
  NBFILES[DIR]++
  if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) {
    MAXSIZE[DIR] = SIZE
    BIGGESTFILE[DIR] = FILE
  }
}

END {
  for (DIR in SUMSIZES) {
    printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR]
  }
}

. Он ожидает входных записей, разделенных нулем (я украл это из ответа Муру ); для каждой входной записи он

  • сохраняет размер (для дальнейшего использования),
  • удаляет все, что находится перед первым символом в пути (так что мы, по крайней мере, правильно обрабатываем имена файлов с пробелами),
  • извлекает каталог,
  • извлекает имя файла,
  • добавляет размер, который мы сохранили ранее, к сумме размеров в каталоге,
  • увеличивает количество файлов в каталоге (чтобы мы могли вычислить среднее значение),
  • если размер больше сохраненного максимального размера для каталога, или, если мы еще не видели файл в каталоге, обновляет информацию для самого большого файла.

После этого сценарий перебирает ключи в SUMSIZES и выводит каталог, средний размер, имя и размер самого большого файла.

Вы можете направить вывод в sort для сортировки по имени каталога. Если вы хотите дополнительно отформатировать размеры в удобной для человека форме, вы можете изменить строку printf на

printf "%.2f %d %s: %s\n", SUMSIZES[DIR] / NBFILES[DIR], MAXSIZE[DIR], DIR, BIGGESTFILE[DIR]

, а затем перенаправить вывод в numfmt --field = 1,2 --to = iec . Вы все еще можете отсортировать результат по имени каталога, вам просто нужно отсортировать, начиная с третьего поля: sort -k3 .

1
29.08.2016, 09:46
0 ответов

Теги

Похожие вопросы