połączyć to, co najlepsze z „du” i „tree”

21

Zastanawiam się, czy możemy połączyć uczciwość „du” z wciętym formatowaniem „drzewa”. Jeśli chcę listę rozmiarów katalogów:

du -hx -d2

... wyświetla dwa poziomy głębokości i wszystkie podsumowania rozmiarów są uczciwe, ale nie ma wcięć subdirów. Z drugiej strony:

tree --du -shaC -L 2

... ładnie wcina i koloruje, jednak podane rozmiary są kłamstwem. Aby uzyskać rzeczywiste rozmiary, należy:

tree --du -shaC

... co oznacza, że ​​otrzymujesz prawdziwe rozmiary tylko wtedy, gdy pozwolisz drzewu pokazać całą strukturę katalogów. Chciałbym móc zawsze mieć poprawne podsumowania wielkości, niezależnie od tego, ile poziomów podkatalogów chcę wyświetlić. Często to robię:

tree -du -shaC | grep "\[01;34m"

... który przycina wszystko oprócz katalogów i ładnie je wcina ... ale nie ma łatwego sposobu ograniczenia wyświetlania tylko do określonych poziomów liczbowych (bez kłamliwych podsumowań). Czy istnieje sposób? Być może brakowało mi właściwych przełączników ...

Ray Andrews
źródło

Odpowiedzi:

8

Sprawdź także ncdu : http://dev.yorhel.nl/ncdu

Na stronie znajduje się również lista innych „podobnych projektów”:

gt5 - Całkiem podobny do ncdu, ale inne podejście.

tdu - Kolejne małe narzędzie do wizualizacji użycia dysku oparte na ncurses.

TreeSize - GTK, używając widoku drzewa.

Baobab - GTK, używając wykresów kołowych, widoku drzewa i mapy drzew. Pochodzi z GNOME.

GdMap - GTK, z wyświetlaczem mapy.

Filelight - KDE, używając wykresów kołowych.

KDirStat - KDE, z wyświetlaczem mapy.

QDiskUsage - Qt, przy użyciu wykresów kołowych.

xdiskusage - FLTK, z wyświetlaczem mapy.

fsv - wizualizacja 3D.

Filozofia - internetowy klon Filelight.

David Potočnik
źródło
1
Dzięki David, w końcu obejrzałem je. Wybrałem ncdu.
Ray Andrews,
@ David, skąd pochodzi Tdu?
shirish
@shirish Odwołaj się do mojego źródła, wspomnianego powyżej
David Potočnik
11

Nie musisz grep dla kodu koloru, -dopcja jest list directories only.

Wydaje się, że robi to, co chcesz:

$ tree --du -d -shaC | grep -Ev '(  *[^ ]* ){2}\['
.
├── [  18]  dir1
├── [  30]  dir2
├── [ 205]  junk
│   ├── [  18]  dir1
│   ├── [  30]  dir2
│   └── [  76]  dir3
├── [ 119]  merge
└── [  20]  stuff

 4.4K used in 10 directories

grepPolecenie usuwa wszystkie linie, które (po jednej lub więcej przestrzeni przez nie przestrzeni, a następnie miejsca) dwa razy, a następnie [.

Jeśli chcesz głębokość 1, zmień licznik związany w {} nawiasach klamrowych na {1}zamiast {2}. to samo, jeśli chcesz głębokość 3, zmień ją na {3}.

Możesz zmienić to w funkcję powłoki, tak jak to:

mytreedu() {
  local depth=''

  while getopts "L:" opt ; do
      case "$opt" in
          L) depth="$OPTARG" ;;
      esac
  done

  shift "$((OPTIND-1))"

  if [ -z "$depth" ] ; then
      tree --du -d -shaC "$@"
  else   
      local PATTERN='(  *[^ ]* ){'"$depth"'}\['
      tree --du -d -shaC "$@" | grep -Ev "$PATTERN"
  fi
}

Służy getoptsdo „kradzieży” dowolnej -Lopcji i jej argumentu z treelinii poleceń, jeśli taka istnieje. Jeśli nie ma -L nopcji w wierszu poleceń, to też działa.

Wszystkie inne opcje i argumenty są przekazywane do treepolecenia.

local PATTERN=...Linia nie jest to naprawdę konieczne. Zrobiłem to tylko w ten sposób, aby upewnić się, że zmieści się w jednej linii, a nie zawinie w tym miejscu U&L. Wyrażenie regularne mogłoby i prawdopodobnie powinno po prostu przejść bezpośrednio do tree | grep ...linii.

Uruchom tak:

mytreedu 

lub

mytreedu -L 2 /path/to/dir/
cas
źródło
1
Uwielbiam kod, ale powtórz, że nie możesz użyć „-d”, ponieważ jeśli tak, podsumowania rozmiaru są niepoprawne lub przynajmniej są tutaj. Rozmiar będzie zawsze zgłaszany jako „4096”, co jest rozmiarem wpisu dla samego katalogu, ale nie rozmiarem całej jego zawartości.
Ray Andrews,
... powinienem był powiedzieć „4096” dla każdego katalogu w bieżącym katalogu ... ale nie dostajesz rozmiarów katalogu, w tym jego plików.
Ray Andrews,
wspomniałeś tylko o -Lproblemie, w ogóle o nim nie wspomniałeś -d. Teraz, gdy przyjrzę się bliżej zgłoszonym liczbom, ani tree --dunie tree --du -dzgłaszam rozmiarów, które w jakikolwiek sposób przypominają te zgłoszone przez du.
cas
Należy zauważyć, że cokolwiek mniejszego niż 100% wyświetlacz nie zapewni prawidłowych rozmiarów. Możesz ograniczyć przez „-d”, „-L 2” lub cokolwiek innego - nie jest pokazane, nie jest liczone w rozmiarze.
Ray Andrews,
tree --dui tak nie wydaje się podawać prawidłowych rozmiarów katalogów, z lub bez -dlub -L. Nie mam pojęcia, jakie powinny być liczby, ale nie mają one związku z tym, jakie duraporty.
cas
3

Możesz użyć Dutree

wprowadź opis zdjęcia tutaj

  • kolorowe wyjście, zgodnie ze zmienną środowiskową LS_COLORS.
  • wyświetlić drzewo systemu plików
  • możliwość agregowania małych plików
  • możliwość wykluczenia plików lub katalogów
  • umiejętność porównywania różnych katalogów
  • szybki, napisany w Rust
nachoparker
źródło
1

Nie ma żadnego doskonałego narzędzia do polecenia, aby to zrobić, ale znalazłem dwa sposoby, które są blisko.

  • pokazuje zarówno rozmiar folderów, jak i plików, ale nie pokazuje się w trybie drzewa.

    du -ah --max-depth=1 /var/log

  • pokazuje w trybie drzewa, ale tylko rozmiar plików, foldery są policzone

    tree -ah /var/log -L 1

Valiant Jiang
źródło
0

Zainspirowany przez cas, teraz robię to:

treee ()
{
    integer levels=$(( ($1 + 1) * 4 ))
    tree --du -shaC | grep "\[01;34m" | grep -Ev "^[^\[]{$levels}\[*"
    du -sh .
}
Ray Andrews
źródło
jeśli zamierzasz wyrzucić wszystkie rzeczy związane z getopts, powinieneś przynajmniej mieć je "$@"natychmiast po -shaC. w przeciwnym razie ta funkcja jest na stałe zakodowana do pracy tylko w bieżącym katalogu.
cas
Kiedy już zaczniemy działać, zamierzam cię o to zapytać: proszę o rozwinięcie. Oczywiście o „$ @”, ale jak dotąd używam go tylko w bieżącym katalogu, więc jeszcze tego nie zauważyłem. Wszystkie te „getopty” są dla mnie nowe, chciałbym wiedzieć, co tam myślisz.
Ray Andrews,
Jedną z zalet używania getoptsjest to, że opcje mogą pojawiać się w dowolnej kolejności w wierszu poleceń. Początkowa wersja mytreefunkcji, którą napisałem, używała „$ 1”, podobnie jak twoja, więc argument głębokości musiał być pierwszym argumentem i nie był opcjonalny. Uznałem, że to nie jest wystarczająco dobre, więc użyłem wbudowanego basha getoptsdo przetworzenia -Lopcji. Umożliwiło to wyświetlenie -L nopcji w dowolnym miejscu wiersza polecenia. Pozwoliło to również być całkowicie opcjonalne.
cas
innym sposobem spojrzenia na to jest to, że getoptspozwala pisać skrypty, które przyjmują prawdziwe opcje i argumenty (zamiast tylko argumentów na pozycjach zakodowanych na stałe, takich jak 1 $ 2 $ 3 $ itp.), tak jak większość innych programów w twoim systemie. A jeśli korzystasz z getoptprogramu (uwaga, która nie zawiera s) z util-linuxpakietu, możesz używać zarówno krótkich opcji jednoliterowych (np. -l), Jak i długich (jak --long), tak jak programów GNU.
cas
Ach ... teraz do mnie wraca. Tak, użyłem tego raz. Musisz spojrzeć na to jeszcze raz. Dzięki.
Ray Andrews,