Могу ли я получить «du», сгруппированный по месяцам?

У меня есть каталог с большим количеством фотографий. В частности, du -sh --apparent-size /path/to/myfolder дает мне 331G. Это здорово. Но теперь я хочу получить список, сгруппированный по месяцам, например, что-то вроде этого:

 2016-01 20MB 2016-02 520MB 2016-03 312MB ... 

Есть ли (разумный) способ сделать это с помощью встроенных linux, или я должен просто написать свою собственную утилиту Python для этого?

One Solution collect form web for “Могу ли я получить «du», сгруппированный по месяцам?”

В linux попробуйте:

 find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort 

Как это работает

  • find /my/path

    Это ищет файлы в / my / path.

  • -maxdepth 1

    Это говорит о find не искать в подкаталогах. (Если вы хотите получить рекурсивный поиск, опустите эту опцию.)

  • -type f

    Это говорит о том, что поиск ограничивает поиск обычными файлами.

  • -printf '%TY-%Tm %s\n'

    Это говорит о find что распечатать год за месяц следует за размером в байтах для каждого файла.

    Поскольку мы не используем их, имена найденных файлов не печатаются.

  • b[$1]+=$2

    Для каждого найденного файла мы добавляем его байт-счет, найденный из столбца 2, в счетчик, который сочетает этот год-месяц в ассоциативном массиве b .

  • END{for (date in b) print date, b[date]}

    После того как мы обработаем весь вывод из find , мы распечатаем результаты.

  • sort

    Это сортирует результаты в порядке дат.

Многострочная версия

Для тех, кто предпочитает, чтобы их код распространялся по нескольким строкам:

 find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk ' { b[$1]+=$2 } END{ for (date in b) print date, b[date] } ' | sort 

пример

Рассмотрим каталог с этими файлами:

 $ ls -l total 27816 -rw------- 1 john1024 john1024 2459173 Nov 23 2015 img100.jpg -rw------- 1 john1024 john1024 3479750 Nov 23 2015 img101.jpg -rw------- 1 john1024 john1024 4028939 Nov 23 2015 img102.jpg -rw------- 1 john1024 john1024 2928519 Jul 30 18:55 img103.jpg -rw------- 1 john1024 john1024 2948294 Jul 30 18:55 img104.jpg -rw------- 1 john1024 john1024 3177583 Aug 1 16:56 img105.jpg -rw-rw---- 1 john1024 john1024 3111737 Apr 18 2016 img106.jpg -rw-rw---- 1 john1024 john1024 1441310 Apr 18 2016 img107.jpg -rw-rw---- 1 john1024 john1024 2430158 Apr 25 16:26 img108.jpg -rw-rw---- 1 john1024 john1024 2424504 Apr 25 16:26 img109.jpg 

Вывод нашей команды:

 $ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort 2015-11 9967862 2016-04 9407709 2016-07 5876813 2016-08 3177583 

Уточнения

Если мы хотим получить результат в mebibytes (MiB) вместо байтов, мы можем преобразовать единицы следующим образом:

 $ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]/1024**2, "MiB"}' | sort 2015-11 9.50609 MiB 2016-04 8.97189 MiB 2016-07 5.60457 MiB 2016-08 3.03038 MiB 

Мы можем еще больше контролировать выходной формат, используя printf . Здесь, чтобы сохранить только одну цифру после десятичной точки, мы отформатируем размер с помощью %5.1f :

 $ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) printf "%s %5.1f MiB\n", date, b[date]/1024**2}' | sort 2015-11 9.5 MiB 2016-04 9.0 MiB 2016-07 5.6 MiB 2016-08 3.0 MiB 
  • Требование пароля для всех файлов с указанным расширением
  • Ограничение размера файла
  • Есть ли способ определить, какой процесс создает файл в osx 10.6.8
  • Проверьте, существует ли в каталоге несколько файлов
  • Симметричная разностная труба?
  • Двоичный, не доступный из Bash, несмотря на то, что он находится в пути
  • Лучший способ синхронизации файлов - копировать только СУЩЕСТВУЮЩИЕ файлы и только если NEWER, чем целевой
  • Как разбить файл, используя границы ключевых слов
  • Linux альтернатива истории файлов / теневые копии для внутренней резервной копии?
  • Объединение двух файлов
  • Не удается удалить файл из-за «Недопустимый аргумент»
  • Переименовать файлы для вставки _ между словами StudlyCapsified
  • Interesting Posts

    Можно ли просмотреть текст в формате unicode в выводе tcpdump?

    Какие параметры мне передать grep, чтобы возвращать только имена файлов?

    Есть ли способ раскрасить конфликты в git-выходе команд merge / rebase / patch / am?

    Найти путь DVD-ROM во FreeBSD

    Как получить положительный сигнал при успешном завершении команды

    Как установить Adobe Reader в Fedora 20?

    Синтаксическая ошибка: слово «неожиданно» (ожидается «)») при удаленном запуске, но без проблем выполняется локально

    Не удается отформатировать поврежденную 32-гигабайтную SD-карту

    Проблемы с нерегулярным выпуском Systemd

    Где утилита rpath или как ее установить?

    Можете ли вы назначить произвольные привязки клавиш в xmonad?

    Принудительная запись (2) для возврата 0

    Есть ли менеджер обновлений без зависимостей gnome для xfce?

    iotop показывает 1,5 Мбайт / с записи на диск, но все программы имеют 0,00 B / s

    Почему pulseaudio обрабатывает соединение с качеством звука с устройством BT?

    Linux и Unix - лучшая ОС в мире.