Aya göre gruplandırılmış bir grup alabilir miyim?


14

İçinde çok fazla fotoğraf bulunan bir dizin var. Özellikle, du -sh --apparent-size /path/to/myfolderbana 331G verir. Hangi harika. Ama şimdi ay, örneğin böyle bir şey gruplandırılmış bir liste almak istiyorum:

2016-01   20MB
2016-02  520MB
2016-03  312MB
...

Bunu linux yerleşikleriyle yapmanın (makul) bir yolu var mı, yoksa sadece kendi Python yardımcı programını yazmalı mıyım?


1
Linux yerleşik değildir , bir işletim sistemi çekirdeğidir. Bunun yerine bazı Linux tabanlı işletim sistemlerinde (Debian, Fedora, ChromeOS ... gibi) varsayılan olarak bulunan komutlarla mı kastediyorsunuz ?
Stéphane Chazelas

8
Linux çekirdeği linux çekirdeğidir ve eğer linux çekirdeği yerleşikleri demek isteseydim bunu söylerdim. Bilgiçlik yapman gerekiyorsa , en iyi 5 linux dağıtımından herhangi birinin varsayılan yüklemesiyle istatistiksel olarak yüklemiş olabileceğin genel araçlar kümesini kastediyorum.
Wayne Werner

1
@WayneWerner Başka bir deyişle, Bash, Coreutils ve GNU işletim ortamının diğer temel bileşenleri dahil olmak üzere GNU / Linux'u kastediyorsunuz. #rmswasright
Damian Yerrick

Yanıtlar:


23

Linux'ta şunu deneyin:

find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort

Nasıl çalışır

  • find /my/path

    Bu, / yolumdaki / yolumdaki dosyaları arar.

  • -maxdepth 1

    Bu findalt dizinlere bakmamanızı söyler . (Yinelemeli arama yapmak istiyorsanız, bu seçeneği atlayın.)

  • -type f

    Bu find, aramayı normal dosyalarla sınırlandırmayı söyler .

  • -printf '%TY-%Tm %s\n'

    Bu, findyıl-ay ve ardından her dosya için bayt cinsinden boyutu yazdırmayı söyler .

    Bunları kullanamadığımız için bulunan dosyaların adları yazdırılmaz.

  • b[$1]+=$2

    Bulunan her dosya için, sütun 2'de bulunan bayt sayısını ilişkilendirilebilir dizideki o yıl-aylık kombinasyonun sayısına ekleriz b.

  • END{for (date in b) print date, b[date]}

    Kaynağındaki tüm çıktıları findişledikten sonra sonuçları yazdırıyoruz.

  • sort

    Bu, sonuçları tarih sırasına göre sıralar.

Çok satırlı sürüm

Kodlarını tercih edenler için birden fazla satıra yayılmışlar:

find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' |
  awk '
    {
      b[$1]+=$2
    }

    END{
      for (date in b)
        print date, b[date]
    }
    ' | sort

Misal

Şu dosyaları içeren bir dizini ele alalım:

$ ls -l
total 27816
-rw------- 1 john1024 john1024 2459173 Nov 23  2015 img100.jpg
-rw------- 1 john1024 john1024 3479750 Nov 23  2015 img101.jpg
-rw------- 1 john1024 john1024 4028939 Nov 23  2015 img102.jpg
-rw------- 1 john1024 john1024 2928519 Jul 30 18:55 img103.jpg
-rw------- 1 john1024 john1024 2948294 Jul 30 18:55 img104.jpg
-rw------- 1 john1024 john1024 3177583 Aug  1 16:56 img105.jpg
-rw-rw---- 1 john1024 john1024 3111737 Apr 18  2016 img106.jpg
-rw-rw---- 1 john1024 john1024 1441310 Apr 18  2016 img107.jpg
-rw-rw---- 1 john1024 john1024 2430158 Apr 25 16:26 img108.jpg
-rw-rw---- 1 john1024 john1024 2424504 Apr 25 16:26 img109.jpg

Komutumuzun çıktısı:

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort
2015-11 9967862
2016-04 9407709
2016-07 5876813
2016-08 3177583

Hassaslaştırmalar

Çıktıyı bayt yerine mebibit (MiB) cinsinden istiyorsak, birimleri şu şekilde dönüştürebiliriz:

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]/1024**2, "MiB"}' | sort
2015-11 9.50609 MiB
2016-04 8.97189 MiB
2016-07 5.60457 MiB
2016-08 3.03038 MiB

Kullanarak çıktı biçimi üzerinde daha fazla kontrol elde edebiliriz printf. Burada, ondalık noktadan sonra yalnızca bir basamak tutmak için boyutu şu şekilde biçimlendiririz %5.1f:

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) printf "%s %5.1f MiB\n", date, b[date]/1024**2}' | sort
2015-11   9.5 MiB
2016-04   9.0 MiB
2016-07   5.6 MiB
2016-08   3.0 MiB

Bu fantastik. Herhangi bir awk öğretici tavsiye edebilir misiniz? Henüz yirmi saniye içinde gözlerimi çaprazlamayan birini bulamadım.
hBy2Py

1
@ hBy2Py awk için en sevdiğim giriş, şimdi biraz tarihli olsa da, Grymoire öğreticisidir .
John1024

i kullanmanızı öneririz printf "%s %9d\n", date, b[date]yerine print date, b[date]ikinci sütuna uzay dolgu eklemek
rav_kr

@rav_kr İyi fikir. Cevabı az önce kullanan bir örnekle güncelledim printf.
John1024

Eğer varsa FWIW findbu desteklere -maxdepthsen muhtemelen sahip [g]awkolduğunu desteklerPROC_INFO["sorted_in"]="@ind_str_asc"
dave_thompson_085
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.