menggabungkan yang terbaik dari 'du' dan 'tree'


21

Saya bertanya-tanya apakah kita bisa menggabungkan kejujuran 'du' dengan pemformatan indentasi 'pohon'. Jika saya ingin daftar ukuran direktori:

du -hx -d2

... menampilkan dua level dan semua ringkasan ukuran jujur, tetapi tidak ada indentasi dari subdir. Di samping itu:

tree --du -shaC -L 2

... indentasi dan pewarnaan dengan baik namun ukuran yang dilaporkan adalah bohong. Untuk mendapatkan ukuran sebenarnya, seseorang harus:

tree --du -shaC

... artinya Anda hanya mendapatkan ukuran sebenarnya jika Anda membiarkan 'tree' menampilkan seluruh struktur direktori. Saya ingin selalu dapat memiliki ringkasan ukuran yang benar terlepas dari berapa banyak tingkat subdir yang ingin saya tampilkan. Saya sering melakukan ini:

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

... yang memangkas segalanya kecuali direktori, dan memberi indentasi dengan baik ... tetapi tidak ada cara mudah untuk membatasi tampilan hanya pada level angka tertentu (tanpa ringkasan ringkasan). Apakah ada cara? Mungkin saya telah melewatkan switch yang benar ...

Jawaban:


8

Juga checkout ncdu : http://dev.yorhel.nl/ncdu

Halamannya juga mencantumkan "proyek serupa" lainnya:

GT5 - Cukup mirip dengan ncdu, tetapi pendekatan yang berbeda.

tdu - Utilitas visualisasi penggunaan disk berbasis ncurses kecil lainnya.

TreeSize - GTK, menggunakan treeview.

Baobab - GTK, menggunakan pie-chart, treeview, dan treemap. Dilengkapi dengan GNOME.

GdMap - GTK, dengan tampilan treemap.

Filelight - KDE, menggunakan diagram lingkaran.

KDirStat - KDE, dengan tampilan treemap.

QDiskUsage - Qt, menggunakan pie-chart.

xdiskusage - FLTK, dengan tampilan treemap.

fsv - visualisasi 3D.

Philesight - tiruan Filelight berbasis web.


1
Terima kasih David, akhirnya sempat melihat itu. Saya memilih ncdu.
Ray Andrews

@ David dari mana asal tdu?
shirish

@shirish Lihat sumber saya, yang tercantum di atas
David Potočnik

11

Anda tidak perlu memahami kode warna, -dopsinya adalahlist directories only .

Ini tampaknya melakukan apa yang Anda inginkan:

$ 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

The grepperintah menghapus semua baris yang telah (satu atau lebih spasi diikuti dengan non-ruang diikuti dengan spasi) dua kali, diikuti oleh[ .

Jika Anda menginginkan kedalaman 1, ubah jumlah terikat di dalam kurung kurawal {} menjadi {1}alih-alih {2}. sama jika Anda ingin kedalaman 3, ubah ke{3} .

Anda bisa mengubahnya menjadi fungsi shell, seperti:

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
}

Ini digunakan getoptsuntuk "mencuri" -Lopsi dan argumennya dari treebaris perintah, jika ada. Jika tidak ada -L nopsi di baris perintah, maka itu juga berfungsi.

Semua opsi dan argumen lainnya diteruskan ke treeperintah.

The local PATTERN=...garis tidak benar-benar diperlukan. Saya hanya melakukan itu seperti itu untuk memastikan bahwa itu akan cocok pada satu baris dan bukan bungkus kata di sini U&L. Ekspresi reguler bisa dan mungkin harus langsung di tree | grep ...telepon.

Jalankan seperti ini:

mytreedu 

atau

mytreedu -L 2 /path/to/dir/

1
Saya suka kodenya, tetapi ulangi bahwa Anda tidak dapat menggunakan '-d' karena jika Anda melakukannya, ringkasan ukuran salah, atau setidaknya mereka ada di sini. Ukurannya akan dilaporkan selalu sebagai '4096' yang merupakan ukuran entri untuk dir itu sendiri, tetapi bukan ukuran dari semua isinya.
Ray Andrews

... seharusnya mengatakan '4096' untuk setiap direktori di bawah direktori saat ini ... tetapi Anda tidak mendapatkan ukuran dir termasuk file itu.
Ray Andrews

Anda hanya disebutkan -Lsebagai masalah, tidak disebutkan -dsama sekali. Sekarang saya melihat lebih dekat pada angka yang dilaporkan, tidak tree --dujuga tree --du -dmelaporkan ukuran yang dengan cara apa pun menyerupai yang dilaporkan oleh du.
cas

Intinya adalah bahwa apapun yang kurang dari 100% tampilan tidak akan memberi Anda ukuran yang benar. Anda dapat membatasi melalui '-d' atau '-L 2' atau apa pun - itu tidak ditampilkan, itu tidak dihitung dalam ukuran.
Ray Andrews

tree --duSepertinya tidak memberikan ukuran yang benar untuk direktori, dengan atau tanpa -datau -L. Saya tidak tahu angka-angka yang seharusnya, tetapi mereka tidak terkait dengan dulaporan apa .
cas

3

Anda bisa menggunakan dutree

masukkan deskripsi gambar di sini

  • keluaran berwarna, sesuai dengan variabel lingkungan LS_COLORS.
  • tampilkan hierarki sistem file
  • kemampuan untuk mengumpulkan file kecil
  • kemampuan untuk mengecualikan file atau direktori
  • kemampuan untuk membandingkan berbagai direktori
  • cepat, ditulis dalam Rust

1

Tidak ada alat perintah yang sempurna untuk melakukan ini, Tapi saya menemukan dua cara yang dekat.

  • menunjukkan ukuran folder dan file, tetapi tidak ditampilkan dalam mode hierarki.

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

  • ditampilkan dalam mode hierarki tetapi hanya ukuran file, folder dalam hitungan

    tree -ah /var/log -L 1


0

Terinspirasi oleh cas, saya sekarang melakukan ini:

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

jika Anda akan membuang semua barang getopts, Anda setidaknya harus "$@"segera memiliki setelah mendapatkan -shaC. jika tidak, fungsi tersebut dikodekan untuk berfungsi hanya untuk direktori saat ini.
cas

Setelah kami berhasil, saya akan bertanya tentang hal itu: tolong jelaskan. Benar tentang "$ @" tentu saja, tapi sejauh ini saya hanya menggunakannya di direktori saat ini, jadi belum menyadarinya. Semua hal 'getopts' ini baru bagi saya, saya ingin tahu apa yang Anda pikirkan di sana.
Ray Andrews

Salah satu manfaat menggunakan getoptsadalah bahwa opsi dapat muncul dalam urutan apa pun pada baris perintah. Versi awal dari mytreefungsi yang saya tulis menggunakan "$ 1" seperti yang Anda lakukan, jadi argumen kedalaman harus menjadi argumen pertama, dan itu bukan opsional. Saya memutuskan bahwa itu tidak cukup baik sehingga menggunakan bash-builtin getoptsuntuk memproses -Lopsi. Ini memungkinkan -L nopsi muncul di mana saja di baris perintah. Itu juga memungkinkan untuk sepenuhnya opsional.
cas

Cara lain untuk melihatnya adalah getoptsmemungkinkan Anda untuk menulis skrip yang mengambil opsi dan argumen nyata (bukan hanya args di posisi hard-code seperti $ 1 $ 2 $ 3 dll), seperti kebanyakan program lain di sistem Anda. Dan jika Anda menggunakan getoptprogram (perhatikan bahwa tanpa s) dari util-linuxpaket Anda dapat menggunakan kedua opsi huruf tunggal (misalnya -l) dan opsi panjang (seperti --long) seperti program GNU.
cas

Ah ... itu kembali padaku sekarang. Ya, saya pernah menggunakannya sekali. Harus melihatnya lagi. Terima kasih.
Ray Andrews
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.