Вы можете использовать
du --inodes * |sort -nr
du --inodes *
даст количество файлов по каталогам, а sort -nr
отсортирует это число в порядке убывания
Судя по вашему (небольшому) образцу сообщений smartctl
выше, их части в основном разделены "<пробел> <чем угодно, кроме строчной буквы>" ( кроме поля "# nnn" в самом начале строки).
sed
может помочь разделить части:
$ smartctl_output="\
# 1 Short offline Completed without error 00% 7264 -
# 2 Short offline Completed without error 00% 7240 -
# 1 Short offline Completed: read failure 20% 717 555027747"
$ csv="$( sed 's/ //; s/ \([^[:lower:]]\)/,\1/g' <<< "$smartctl_output" )"
$ echo "$csv"
#1,Short offline,Completed without error,00%,7264,-
#2,Short offline,Completed without error,00%,7240,-
#1,Short offline,Completed: read failure,20%,717,555027747
Если это то, что вы хотите, теперь вы можете заполнить свой массив, как вы это делали с HDDinfo.
[update]
Вот объяснение части sed
, которая выполняет разбиение: программа sed
состоит из двух частей, которые я поместил в одну линию. Вот расширенная версия:
sed '
s/ //
s/ \([^[:lower:]]\)/,\1/g
'
Программа sed
работает с каждой строкой ввода: она считывает одну строку, применяет набор преобразований и печатает строку.Затем он начинается со следующей строки до тех пор, пока больше не останется строк для чтения.
Здесь первая sed
команда s / //
удаляет первый пробел, объединяющий «#» и следующее число.
Затем вторая команда sed
s / \ ([^ [: lower:]] \) /, \ 1 / g
выполняет поиск в начале каждого поля (как определено на "<пробел> <все, кроме строчных букв>") и заменяет пробел двоеточием. \ 1
относится к регулярному выражению в круглых скобках « \ ([^ [: lower:]] \)
», которое представляет первый символ следующего поля.
Оставшаяся часть представляет собой тест: вместо того, чтобы передать sed
содержимое файла или вывод команды, я передал ему переменную smartctl_output
(строка, сделанная ваших образцов), и я присвоил результат переменной csv
.
[обновление №2]
Теперь кажется, что поля разделены двумя или более пробелами. Это даже проще, чем раньше. Команда sed
преобразуется в:
sed 's/ \+/,/g'
Что означает: заменить все серии из двух или более пробелов двоеточием.
Я не могу придумать способ сделать это изначально в оболочке, но в perl
, например, вы могли бы определить регулярное выражение для разделения полей, и используйте его, чтобы вставить один разделитель по вашему выбору, который затем можно было бы просто прочитать, используя IFS =,
или что-то еще.
Согласно вашему образцу, поля могут быть разделены пробелом, за которым следует:
Итак, передайте вашу команду примерно так:
. . . |
perl -F'[[:space:]](?=[[:upper:]-]|[[:digit:]]{2,})' -anle 'print join ",", @F'