logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Bash] Skrypt do obliczania zajętości dysku przez pliki użytkowników

Kostek7 09 Lis 2009 08:23 2415 7
REKLAMA
  • #1 7235201
    Kostek7
    Poziom 27  
    Posty: 1245
    Pomógł: 92
    Ocena: 61
    Witam!
    Chciałbym napisać skrypt, który wypisze ile miejsca na dysku zajmują dane należące do danego konta.
    
    find / -user root -exes ls -l {}\; | awk `{s+=$5} END {print #3, s/1024, "K"}`
    

    Niestety wywala mi błąd. {s+=} command not found. Jak to poprawić ?
    Czy można było by rozszerzyć działanie skryptu, tak aby działa dla wszystkich kont na danym komputerze ?
    for Z in /tu brakuje mi jakiejś komendy zwracającej listę kont użytkowników danego komputera/ ;do
  • REKLAMA
  • #2 7235388
    xanio
    Poziom 27  
    Posty: 933
    Pomógł: 68
    Ocena: 55
    może zamiast
    s+=$5
    let "s += $5"
  • REKLAMA
  • #3 7235407
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Chyba nie te apostrofy, jeżeli dobrze widzę - mają być te normalne, a nie ukośne.
  • REKLAMA
  • #4 7237085
    Kostek7
    Poziom 27  
    Posty: 1245
    Pomógł: 92
    Ocena: 61
    Przepisałem to tak:
    
    find / -user root -exec ls -l {}\; | awk '{let "s += $5"} END {print #3, s/1024, "K"}'
    

    Apostrofy zamienione ,zgodnie z tym co pisze kolega szelus oraz poprawiłem wyrażenie s+=$5 na let "s += $5" tak jak pisze kolega xanio.
    Otrzymuje błąd:
    find brak argumentu dla -exec
    awk line 2 : missing } near end of file

    Co do rozszerzenia funkcjonalności, dowiedziałem się iż listę kont uzyskam z cat /etc/passwd. Pracuję z LiveCD dlatego ma jedna konto. U mnie wygląda to tak:
    [Bash] Skrypt do obliczania zajętości dysku przez pliki użytkowników
    Czy ktoś mógłby się podzielić screenem na którego podstawie mógłbym próbować wyznaczyć tę listę ?
  • REKLAMA
  • Pomocny post
    #5 7238945
    xanio
    Poziom 27  
    Posty: 933
    Pomógł: 68
    Ocena: 55
    przepraszam, wprowadziłem Cię w błąd:
    find / -user root -exec ls -l {} \; | awk '{s+=$5} END {print s/1024, "K"}'
  • #6 7239122
    Kostek7
    Poziom 27  
    Posty: 1245
    Pomógł: 92
    Ocena: 61
    Kolego xanio wielkie dzięki :)
    Skrypt dal find / okazał się niemiłosierni nieoptymalny dlatego aby dobrze prezentować jego działanie postanowiłem dać find ~/. Teraz postaram się zastanowić jak ulepszyć mój skrypt.
  • #7 7239287
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    Bez sensu - dla każdego pliku wykonujesz exec komendy ls.
    Poczytaj o opcji -printf w manualu do find (specyfikator %k lub %s).

    Poza tym możesz ograniczyć wyszukiwanie tylko do zwykłych plików (-type f), bo z tego co widzę Twój skrypt zliczy pliki w każdym katalogu 2 razy - raz wykonując ls na katalogu, a drugi raz na pliku w tym katalogu.

    Dla zaawansowanych: nie zapomnij o "twardych dowiązaniach", czyli plikach na tym samym systemie plików które mają ten sam numer i-węzła (inode). Możesz użyć -printf do wypisania numeru i-węzła + rozmiaru, później pipe do sort i uniq, a dopiero później sumowanie po drugiej kolumnie.

    Pozdrawiam,
    Dr.Vee

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy stworzenia skryptu Bash do obliczania zajętości dysku przez pliki należące do poszczególnych użytkowników systemu Linux. Problemem było błędne użycie składni w poleceniu awk, gdzie zamiast poprawnego `{s+=$5}` użyto nieprawidłowego `let "s += $5"`, co powodowało błąd "command not found". Poprawna składnia awk to `awk '{s+=$5} END {print s/1024, "K"}'`. Wskazano również błąd w użyciu opcji `-exec` w find, gdzie brakowało poprawnego zakończenia polecenia `;`. Zasugerowano ograniczenie wyszukiwania do zwykłych plików (`-type f`) oraz wykorzystanie opcji `-printf` w find, która pozwala na bardziej efektywne pobieranie rozmiarów plików bez wywoływania zewnętrznych poleceń. Poruszono także kwestię twardych dowiązań (hard links) i konieczność ich uwzględnienia przy sumowaniu rozmiarów plików, np. przez sortowanie i unikalność inode. Autor planuje rozszerzyć skrypt na wszystkie konta użytkowników, korzystając z listy kont uzyskanej z pliku `/etc/passwd`. Wspomniano także alternatywne podejście oparte na kwotach dyskowych, jednak autor preferuje rozwiązanie z find i awk.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA