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 ...

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.


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/

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

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


0

Zainspirowany przez cas, teraz robię to:

treee ()
{
    integer levels=$(( ($1 + 1) * 4 ))
    tree --du -shaC | grep "\[01;34m" | grep -Ev "^[^\[]{$levels}\[*"
    du -sh .
}

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.