Как найти общий размер файлов, сгруппированных по расширению

Использование Ubuntu Trusty 14.04 , ядро: 4.2.0-36-generic # 42 ~ 14.04.1-Ubuntu , lxc: 1.0.8-0ubuntu0.3 Мне удалось запустить 32-битный контейнер на 64-битном хосте.

Выполнение следующей команды: lxc-create -n test -t / usr / share / lxc / templates / lxc-download

Получение этих ответов:

Distribution:  ubuntu
Release: trusty
Architecture: i386

Различия в конфигурации очень минимальны: lxc.arch = x86 vs lxc.arch = x86_64

Затем просто запускаем его как обычно: lxc-start -n test

Подтверждено, что ОС считает, что архитектура 32-битная

root@host:~# uname -a
Linux host 4.2.0-36-generic #42~14.04.1-Ubuntu SMP Fri May 13 17:27:22 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
root@host:~# lxc-attach -n test
groups: cannot find name for group ID 111
root@container:~# uname -a
Linux magnum 4.2.0-36-generic #42~14.04.1-Ubuntu SMP Fri May 13 17:27:22 UTC 2016 i686 GNU/Linux

Я думаю, что групповое предупреждение - это что-то в моей настройке, в любом случае это работает!

В Wiki есть примечание об использовании linux32 для эмуляции 32-битной версии. Я не думаю, что это нужно.

linux32 lxc-create -n myvm -t debian-wheezy

9
09.09.2016, 13:45
4 ответа

В системе GNU:

find . -name '?*.*' -type f -printf '%b.%f\0' |
  awk -F . -v RS='\0' '
    {s[$NF] += $1; n[$NF]++}
    END {for (e in s) printf "%15d %4d %s\n", s[e]*512, n[e], e}' |
  sort -n

Или то же самое с perl , избегая расширения -printf GNU find (все еще используя расширение GNU, -print0 , но этот более широко поддерживается в настоящее время):

find . -name '?*.*' -type f -print0 |
  perl -0ne '
    if (@s = stat$_){
      ($ext = $_) =~ s/.*\.//s;
      $s{$ext} += $s[12];
      $n{$ext}++;
    }
    END {
      for (sort{$s{$a} <=> $s{$b}} keys %s) {
        printf "%15d %4d %s\n",  $s{$_}<<9, $n{$_}, $_;
      }
    }'

Он дает следующий результат:

          12288    1 pnm
          16384    4 gif
         204800    2 ico
        1040384   17 jpg
        2752512   83 png

Если вы хотите KiB , MiB . .. суффиксы, вертикальная черта к numfmt --to = iec-i --suffix = B .

% b * 512 показывает использование диска, но учтите, что если файлы жестко связаны несколько раз, они будут подсчитаны несколько раз, поэтому вы можете увидеть несоответствие с тем, что сообщает du .

18
27.01.2020, 20:05

Не так хорошо, как решение Стефана, но вы можете попробовать

find . -type f -name "*.png" -print0 | xargs -0r du -ch | tail -n1

, где вам нужно запустить это для каждого типа файлов.

1
27.01.2020, 20:05

Вот другое решение:

find. -type f |  egrep -o "\.[a-zA-Z0-9]+$" | sort -u | xargs -I '%' find. -type f -name "*%" -exec du -ch {} + -exec echo % \; | egrep "^\.[a-zA-Z0-9]+$|total$" | uniq | paste - -

Часть, которая получает расширения,:

find. -type f |  egrep -o "\.[a-zA-Z0-9]+$" | sort -u

Затем найдите файлы с расширением и также распечатайте их на экране:

xargs -I '%' find. -type f -name "*%" -exec du -ch {} + -exec echo % \;

Далее мы хотим сохранить расширение и общую сумму:

egrep "^\.[a-zA-Z0-9]+$|total$" | uniq

и оставить на той же строке:

paste - -
6
27.01.2020, 20:05

Поскольку у меня еще недостаточно очков репутации, чтобы писать комментарии, я добавлю сюда ответ Стефана Шазеласа. Чтобы включить в список файлы без расширения, например исполняемые файлы, можно использовать эту командную строку:

find. -name '*' -type f -printf '%b.%f\0' | awk -F. -v RS='\0' '{if (NF==2) $(NF+1)=" "; s[$NF] += $1; n[$NF]++} END {for (e in s) printf "%15d %6d  %s\n", s[e]*512, n[e], e}' | sort -rn | numfmt --to=iec-i --suffix=B
2
27.06.2020, 18:19

Теги

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