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

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

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

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

  • Список всех файлов, присутствующих в кеше
  • Замените все вхождения слова в файлах, содержащихся в папке
  • Где хранятся таблицы i-node?
  • Передача: избавиться от старых не удаленных файлов?
  • Почему в директориях / dev для каталогов, например pts?
  • Сценарий оболочки проверяет, существует ли файл?
  • Сколько файлов можно сохранить в одном каталоге в Linux?
  • Разбор символа строки с bash
  • 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 
    Linux и Unix - лучшая ОС в мире.