Подсчет количества файлов в папке за день

11

Я могу найти количество всех файлов в папке, но я получил довольно большое количество.

find . -type f | wc -l      #find number of files in DIR
ls -lrt                     #list all files order by date  

Как узнать количество файлов в день?

Итак, результат должен быть примерно таким:

# left number is number of files and right is one day.

109294 2016-06-27
101555 2016-06-26
88123  2016-06-25 
... etc. 
tasmaniski
источник
А что за цифры слева? 109294и109294
Сергей Колодяжный
1
Sry, это количество файлов в день.
Тасманиски

Ответы:

21

Вы можете сделать это, используя printfдействие, findчтобы напечатать только времена модификации в желаемом формате, а затем используя sortи uniq:

find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
  • -printf '%TY-%Tm-%Td\n'печатает время модификации файлов, например, в 2015-05-23формате

  • sortсортирует вывод и uniq -cделает счет по дате

Пример:

~/foobar% find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
      3 2004-06-29
      1 2004-08-23
      1 2004-09-15
      1 2004-09-18
      1 2005-07-24
      1 2006-02-05
      2 2008-06-25
      3 2008-12-31
      1 2009-03-13
      1 2009-04-30
      1 2010-04-04
      2 2010-09-01
      8 2011-07-13
     15 2011-08-27
      3 2011-11-03
      3 2014-10-08
heemayl
источник
2
NB: они могут быть просмотрены в графическом виде с использованием Gnuplotfind . -type f -printf '%TY-%Tm-%Td\n' 2</dev/null | sort | uniq -c | tail -n +2 | gnuplot -p -e "set xdata time; set timefmt \"%Y-%m-%d\";set xtics rotate; plot '-' using 2:1 with impulses"
user1717828
Интересный способ, но это не работает. Я получил графику, но без данных ...
Тасманиски
4

Вот решение с find+awk

find . -maxdepth 1 -type f -printf '%TY-%Tm-%Td\n' | awk '{array[$0]+=1}END{ for(val in array) print val" "array[val]   }'

По сути, происходит то, что мы находим все обычные файлы и печатаем время их изменения в соответствии с %Tформатом, а затем awkвступаем во владение и подсчитываем каждую строку, используя связанные массивы. END{}оператор использует forцикл , чтобы пройти через все элементы в массиве связанного с ними, и печатать ключ + массив [ключ] содержание (которое является дата + счетчик).

Вы можете использовать sortдля организации вывода, особенно sort -k 1на основе столбца 1 (который является датой), но это не является обязательным. Также -maxdepth 1будет проверять файлы только в текущей папке . Если вы также хотите найти файлы в подкаталогах, удалите -maxdepth 1часть.

Образец вывода

$ find . -maxdepth 1 -type f -printf '%TY-%Tm-%Td\n' | awk '{array[$0]+=1}END{ for(val in array) print val" "array[val]   }'

2015-09-29 1
2016-04-06 2
2016-04-07 10
2016-04-08 2
2015-11-05 2
2016-04-22 2
2016-04-23 6
2016-04-24 1
2015-11-21 2
2015-11-22 2
Сергей Колодяжный
источник
Это может работать быстрее, чем |sort | uniq -cверсия, особенно с очень большим количеством файлов и небольшим количеством разных дней. Свертывание до подсчета за один шаг позволяет избежать сортировки большого количества дубликатов перед подсчетом.
Питер Кордес