AWK - 特定の月に生成されたすべてのファイルの数量と重量を一覧表示するスクリプト[閉じる]

AWK - 特定の月に生成されたすべてのファイルの数量と重量を一覧表示するスクリプト[閉じる]

すべての月について、「/home」ディレクトリ内のすべてのファイルとその重みを計算し、リストを端末に表示するスクリプトをAWKに作成する必要があります。出力は次のようになります。

ここに画像の説明を入力してください。

答え1

ls私はシステムコマンドを使用してファイルを一覧表示し、statそれに関する情報を取得するスクリプトをawkに書きました。これにより、スクリプトはファイル番号とサイズをバイト単位で印刷します。

#!/usr/bin/awk -f


BEGIN {
    dir = "/home/matej"   #chnage default directory

    if(ARGC == 2){   #check for command line arguments
        dir = ARGV[1]
    }
    printf("Listing directory: %s\n", dir)


    cmd = "ls " dir

    m_names[1] = "January"
    m_names[2] = "February"
    m_names[3] = "March"
    m_names[4] = "April"
    m_names[5] = "May"
    m_names[6] = "June"
    m_names[7] = "July"
    m_names[8] = "August"
    m_names[9] = "September"
    m_names[10] = "October"
    m_names[11] = "November"
    m_names[12] = "December"


    while((cmd | getline filename) > 0 ){
        "stat --printf=\"%Y %s\" \"" dir "/" filename "\"" | getline info   #use %W instead of %Y if your system supports date of birth
        #FS = " "
        split(info, arr, " ")
        time = arr[1]
        size = arr[2]

        month = strftime("%m", time) + 0   #+ 0 is for converting string to int and removein first 0

        months[month] = months[month] + 1
        sizes[month] = sizes[month] + size
    } 
    close(cmd)

    #pretty print
    printf("%-11s %-20.18s %s\n", "Month", "Number of files", "Total size of files (in bytes)")
    for(a = 1; a <= 12; a ++){
        printf("%-9s:   %-20s %s\n", m_names[a], months[a], sizes[a])
    }

}

このスクリプトで2つのことを修正します。

  • dir = "/home/matej/"デフォルトディレクトリの変更
  • "stat --printf=\"%Y %s\" \"" dir filename "\"" | getline infoシステムが誕生時間をサポートしている場合は、%Yの代わりに%Wを使用してください。

スクリプトを実行します。

  • chmod +x script.awk
  • ./script.awkまたは議論./script.awk /home/user

私のシステムの出力は次のとおりです。

Listing directory: /home/matej
month       number of files      total size of files
January  :   7                    163860
February :   1                    4096
March    :   1                    4096
April    :   1                    764
May      :   1                    4096
June     :   3                    12288
July     :   2                    13142852623
August   :   2                    8192
September:   1                    16
October  :   8                    10975459334
November :   4                    44067
December :   10                   49152

関連情報