Кількість файлів у папці на день


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. 

А які цифри зліва? 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

2
Примітка: їх можна переглянути графічно за допомогою Gnuplot, використовуючиfind . -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

Цікавий спосіб, але це не працює. У мене з’явилася графіка, але без даних ...
tasmaniski

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версія, особливо з дуже великою кількістю файлів і невеликим набором різних днів. Згортання підрахунків за один крок дозволяє уникнути сортування великої кількості дублікатів перед підрахунком.
Пітер Кордес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.