Puncte:-2

Obțin dimensiunea totală a celor mai mari cinci fișiere ale mele în bash

drapel lr

Încerc să obțin dimensiunea totală a celor cinci fișiere cele mai mari ale mele găsite într-un director, dar nu pot lucra la lista mea. Am două moduri de a găsi și sortare, cele cinci cele mai mari fișiere.

#!/bin/bash

DIR=$1 #Calea directorului de pornire


dacă [ ! -d "$DIR" ]; atunci #dacă directorul nu este găsit
    echo "Directorul nu există!" 
    iesirea 1
fi

echo „Cinci cele mai mari fișiere care folosesc ls sunt:”
test_ls=$( ls -lhR "$DIR" | grep '^-' | sortare -r -k 5 -h | cap -n 5 )
du -ch „$test_ls”


echo „Cinci cele mai mari fișiere care folosesc find/DU sunt:”
test_find=$( găsiți "$DIR" -type f -exec du -ch {} + | sort -rh | head -n 5 )
du -ch „$test_find”

echo "Numărul total de fișiere: "
ls -lhR „$DIR” | grep '^-' | wc -l
echo "Dimensiunea totală a fișierelor: "
du -sh „$DIR” | awk '{print $1}'

Dacă aplic du pe variabila ls, obțin:

du: opțiune nevalidă -- 'r'
du: opțiune nevalidă -- 'w'
du: opțiune nevalidă -- '-'
du: opțiune nevalidă -- 'r'

iar dacă îl aplic pe variabila find, primesc acest lucru pentru fiecare dintre cele cinci fișiere

du: nu poate accesa „429M”: Nu există un astfel de fișier sau director

Atât versiunea ls, cât și versiunea find funcționează bine pentru a enumera cele mai mari cinci fișiere din directorul dat, dar sunt foarte pierdut în modul în care le-aș putea adăuga dimensiunile împreună.

drapel hr
Trebuie să fie bash? Shell-ul zsh, de exemplu, poate sorta și selecta fișiere în funcție de dimensiune direct, de ex. `du -hc **/*(.NDOL[1,5])`
Puncte:1
drapel in

Nu sunt sigur cum să remediați cel mai bine codul, aș propune o abordare diferită fără a fi nevoie du la fel de găsi poate returna dimensiunile fișierelor cu -printf „%s”.

Rețineți, de asemenea, că nu ar trebui să analizezi niciodată ls și asta găsi spre deosebire de ls va rula recursiv dacă nu limitați asta cu -adancime maxima opțiune.


Aceasta ar găsi cele mai mari cinci fișiere dintr-un director și ar însuma dimensiunile acestuia:

găsiți „$DIR” -maxdepth 1 -type f -printf '%s\n' | sort -nr | cap -n5 | paste -sd+ | bc | numfmt --to=iec
  • găsi... -printf '%s\n' va imprima dimensiunile fișierelor în octeți
  • | sort -nr | cap -n5 va găsi cele mai mari cinci numere
  • | pastă -sd+ va uni numerele cu un semn plus între ele, deci este o expresie matematică
  • | bc va rula expresia matematică
  • | numfmt --to=iec (opțional) va converti dimensiunea din octeți în format care poate fi citit de om.

Pentru a obține informații suplimentare, puteți salva găsi ieșire de ex. într-o matrice:

DIR=/unele/dir
file_sizes=($(găsește „$DIR” -maxdepth 1 -type f -printf '%s\n' | sort -nr))

num_files=${#file_sizes[@]}
total_size=$(IFS=+; ecou „$((${file_sizes[*]}))” | numfmt --to=iec)
cele mai mari_fișiere=$(IFS=+; ecou „$((${dimensiuni_fișier[*]:0:5}))” | numfmt --to=iec)

printf „Numărul total de fișiere: %d\nDimensiunea totală a fișierelor: %s\nDimensiunea celor mai mari 5: %s\n” $num_files $total_size $biggest_files

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.