График графика с использованием оболочки для общего количества файлов и даты создания - PullRequest
0 голосов
/ 29 июня 2018

Я хочу создать гистограмму с интервалами общего числа файлов 50 на оси Y и временем, созданным в неделях на оси X (т.е. если новые файлы были созданы между 1 и 2 неделями и т. Д.)

Что-то вроде

200, 150, 100, 50 файлов, созданных за определенную неделю 7, 14, 21, 28 дней по оси Y. Вид потерян на том, как это реализовать. Любая помощь приветствуется

Обновление: я пытаюсь в этом направлении

find <dirname> -type f -ctime -1 -ctime -7 | wc -l
find <dirname> -type f -ctime +7 -ctime -14 | wc -l

Найдите максимальное число и используйте его как верхний предел моей оси X. Затем разделите это число на равные интервалы, чтобы построить мою ось X

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Использование feedgnuplot в домашнем каталоге:

dirname=~
e=0
for f in `seq 7 7 28` ; do 
    find "${dirname}" -type f -ctime +$e -ctime -$f | wc -l
    e=$f 
done 2> /dev/null | 
feedgnuplot  --terminal 'dumb 50,15' --with boxes --unset grid --exit

Выход:

  5500 +-+-----+-------+------+-------+-----+-+   
  5000 +-+ *********   +      +       +     +-+   
  4500 +-+ *       *       ********         +-+   
  4000 +-+ *       *       *      *         +-+   
  3500 +-+ *       *       *      *         +-+   
  3000 +-+ *       *       *      *         +-+   
  2500 +-+ *       *********      *         +-+   
  2000 +-+ *       *       *      *         +-+   
  1500 +-+ *       *       *      *         +-+   
  1000 +-+ *   +   *   +   *  +   ********* +-+   
   500 +-+-********************************-+-+   
       0       1       2      3       4       5 
0 голосов
/ 30 июня 2018

Это начало использования GNU awk для функций времени (не проверено, поскольку вы не предоставили краткий, тестируемый пример ввода, который мы могли бы проверить):

find "$1" -type f -printf '%T@ %p\0' |
awk -v RS='\0' '
BEGIN {
    nowSecs = systime()
}
{
    fileName     = gensub(/\S+\s+/,"",1)
    fileModSecs  = int($1)
    fileAgeSecs  = nowSecs - fileModSecs
    fileAgeDays  = int(fileAgeSecs / (24 * 60 * 60))
    fileAgeWeeks = int(fileAgeDays / 7)
    weekNr       = fileAgeWeeks + 1
    fileCnts[weekNr]++
    numWeeks     = (weekNr > numWeeks ? weekNr : numWeeks)
    maxFileCnt   = (fileCnts[weekNr] > maxFileCnt ? fileCnts[weekNr] : maxFileCnt)
    print nowSecs, fileModSecs, fileAgeSecs, fileAgeDays, fileAgeWeeks, weekNr, fileName | "cat>&2"
}
END {
    for (fileCnt=maxFileCnt; fileCnt>0; fileCnt--) {
        for (weekNr=1; weekNr<=numWeeks; weekNr++) {
            if (weekNr in fileCnts) {
                char[weekNr] = "*"
            }
            printf "%s%s", char[weekNr], (weekNr<numWeeks ? OFS : ORS)
        }
    }
    for (weekNr=1; weekNr<=numWeeks; weekNr++) {
        printf "%s%s", weekNr, (weekNr<numWeeks ? OFS : ORS)
    }
}
'

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

0 голосов
/ 30 июня 2018

Извинения, что ksh вместо bash (уровень bash близок к эхо "Hello World"):) ...

Будет ли это делать то, что вам нужно?

    #!/bin/ksh
    ######################################
    #
    # statDirReport.sh
    #
    version="1.0"
    # Andre Gelinas, 2018
    #
    ######################################

    #############
    # Variables
    #############

    typeset -F2 SCALE

    # Max value of X
    X_SCALE=30


    #############
    # Main
    #############

    if [[ -n $1 ]]; then
        DIRNAME=$1
    else
        print -n "Enter full path to stat : "; read DIRNAME
    fi

    if [[ ! -d $DIRNAME || ! -r $DIRNAME || ! -x $DIRNAME ]]; then
        print "ERROR - Directory unusable - Exiting"
        exit
    fi

    ## Getting the data

    CTIME1=1
    CTIME2=0
    for ((i=1;i<=4;i++)); do
        CTIME2=$(($i*7))
        FILE_COUNT[$i]=$(find $DIRNAME -type f -ctime +$CTIME1 -ctime -$CTIME2 | wc -l)
        #To find late on the max amount
        F_COUNT[${FILE_COUNT[$i]}]=${FILE_COUNT[$i]}
        #
        CTIME1=$CTIME2
    done

    #Doing some math

    ## Highest number of file
    MAX_COUNT=${F_COUNT[-1]}
    ## Find the value of each tick
    SCALE=$(($MAX_COUNT/$X_SCALE))

    ## Find the real length of the histogram for each week
    ## having the highest amount using full x scale (integer mathematics)

    for ((i=1;i<=4;i++)); do
        DATA_2_SCALE[$i]=$(((${FILE_COUNT[$i]}*$X_SCALE)/$MAX_COUNT))
    done

    # Getting the report

    typeset -L2 Col1
    typeset -L1 Col2
    typeset -L$(($X_SCALE+5)) Col3
    typeset -L5 Col4

    Col1="Wk"
    Col2=" "
    Col3="Data"
    Col4="Real"

    clear
    print "statDirReport v$version\tScale is #=$SCALE\n"
    print "$Col1$Col2$Col3$Col4\n"
    for ((i=1;i<=4;i++)); do
        Col1=$i
        Col2="|"
        graph=""
        Col4=${FILE_COUNT[$i]}
        for ((j=1;j<=${DATA_2_SCALE[$i]};j++)); do
            graph+="#"
        done
        Col3=$graph
        print "$Col1$Col2$Col3$Col4"
    done

Изменить, чтобы изменить, чтобы добавить даты в качестве заголовка для гистограмм. Измените последнюю часть сразу после цикла «DATA_2_SCALE»:

    #Setting the title of each histogram

    ## Finding how many sec since the beginning of time

    TODAY_SEC=$(date +"%s")

    ## Finding real date for find range

    SEC_PER_DAY=86400

    lastDate=$(date -u -d @"$TODAY_SEC" +"%m/%d")

    for ((i=1;i<=4;i++)); do
            firstDate=$(date -u -d @"$(($TODAY_SEC-(7*$i*$SEC_PER_DAY)))" +"%m/%d")
            WEEK[$i]=$firstDate" to "$lastDate" "
            lastDate=$firstDate
    done

    # Getting the report

    typeset -L15 Col1
    typeset -L1 Col2
    typeset -L$(($X_SCALE+5)) Col3
    typeset -L5 Col4

    Col1="Wk"
    Col2=" "
    Col3="Data"
    Col4="Real"

    clear
    print "statDirReport v$version\tScale is #=$SCALE\n"
    print "$Col1$Col2$Col3$Col4\n"
    for ((i=1;i<=4;i++)); do
            Col1=${WEEK[$i]}
            Col2="|"
            graph=""
            Col4=${FILE_COUNT[$i]}
            for ((j=1;j<=${DATA_2_SCALE[$i]};j++)); do
                    graph+="#"
            done
            Col3=$graph
            print "$Col1$Col2$Col3$Col4"
    done
...