LINUX.ORG.RU

Помощь с редактированием скрипта

 , ,


0

2

Добрый день, шеф дал задание: есть папка в ней больше 10000 файлов - надо написать скрипт чтобы он подсчитывал количество файлов сделанных каждый день, размер файлов сделанных в этот день.

Что-то в этом роде:

Дата Количество файлов Размер 01 июля 3567 32,8 02 июля 3232 21,1

Набросал легкий скриптик:

 find . -name '*' -printf '%Ad-%Ab %s\n' | awk  'NR==1 {print "DATE\tQUANTITY\tSIZE"}{a[$1]+=$2;b[$1]+=1;}END{for(i in a)print i"\t"b[i]"\t"a[i]/1024}' 
- но эта скотина не правильно подсчитывает количество файлов(добавляет лишние) Пример:

Date Quantity Size 26-Jul 871 4274.85

[root@server01 folder]# ls -l|grep -c 'Jul 26' 710 тоесть вместо 710 файлов обработало 871(( еще пробывал сделать так

#!/bin/bash
if [  $# -le 0 ]
 then  
   echo "Usage: $0 folderName"
   exit 1
 fi

folderName="$1"
for i in $(ls -l $folderName| awk '{print $6"."$7}' | sort | uniq | grep -v '^.$');
    do
        dt=$(echo "$i" | sed "s/\./ /g")
        echo $dt
        find  $folderName -type f  -exec ls -lart {} \; >  /tmp/tmp.txt
        awk '/$dt/''NR == 1 { sum=0;} { sum+=$5; }  END {print "COUNT=" NR, "SIZE=" sum}' /tmp/tmp.txt
    done;

Но оно подсчитывает общий размер файлов и общее количество файлов - вот output: Jul 1 COUNT=18248 SIZE=718566652 Jul 10 COUNT=18248 SIZE=718566652 Jul 11 COUNT=18248 SIZE=718566652 и т.д.

Помогите пожалуйста - от жары мозг плавится. Спасибо громадное за прочтение моего кривого кода


for i in $(ls -l $folderName| awk '{print $6"."$7}' | sort | uniq | grep -v '^.$');

facepalm.jpg

Zmicier ★★★★★
()

шеф дал задание

всея ЛОРу?

anonymous
()

find . -name '*' -printf '%Ad-%Ab %s\n' | awk 'NR==1 {print "DATE\tQUANTITY\tSIZE"}{a[$1]+=$2;b[$1]+=1;}END{for(i in a)print i"\t"b[i]"\t"a[i]/1024}'

Это же подход в целом совершенно верный, однако во-первых, я что-то сомневаюсь, что вам нужно группировать файлы именно по дате последнего доступа. По дате создания их группировать вовсе невозможно, поскольку она, скорее всего, у вас нигде не хранится, но можно по дате изменения.

Ну и переписать это все почище не помешало бы:

#!/bin/bash

cd "$1" || exit 1

find -printf '%TY-%Tm-%Td %s\n' |\
    gawk 'BEGIN {
              OFS="\t";
              print "DATE", "COUNT", "SIZE";
          };

          {
              count[$1]++;
              size[$1] += $2;
          };

          END {
              for (i in count)
                  print i, count[i], size[i];
          };'

Что у вас тут не работало, я не знаю; возможно, у вас там более чем за год файлы были.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 3)

- но эта скотина не правильно подсчитывает количество файлов(добавляет лишние) Пример:

find ищет рекурсивно в поддиректориях тоже.

ограничить: -maxdepth 1

futurama ★★★★★
()
Ответ на: комментарий от futurama

find . -maxdepth 1 -name '*' -printf '%TD %s\n' | awk 'NR==1 {print «DATE\tQUANTITY\tSIZE»}{a[$1]+=$2;b[$1]+=1;}END{for(i in a)print i"\t"b«\t"a/1024}' | sort -n -t»/" -k3 -k1 -k2

Спасибо, действительно не подумал! Заработало!

Huxler
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.