Skip to content

Commit 262f21d

Browse files
committed
List inode information instead of block usage with --inodes
Fixes #6.
1 parent 158ed59 commit 262f21d

File tree

6 files changed

+104
-67
lines changed

6 files changed

+104
-67
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,18 @@ You can simply start duf without any command-line arguments:
4141

4242
duf
4343

44-
If you want to see all devices:
44+
If you want to list everything (including pseudo, duplicate, inaccessible file systems):
4545

4646
duf --all
4747

4848
You can hide individual tables:
4949

5050
duf --hide-local --hide-network --hide-fuse --hide-special --hide-loops --hide-binds
5151

52+
List inode information instead of block usage:
53+
54+
duf --inodes
55+
5256
Sort the output:
5357

5458
# valid sort-keys are: mountpoint, size, used, avail, usage, type, filesystem

main.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,18 @@ import (
1414
var (
1515
term = termenv.ColorProfile()
1616

17-
all = flag.Bool("all", false, "show all devices")
18-
17+
all = flag.Bool("all", false, "include pseudo, duplicate, inaccessible file systems")
1918
hideLocal = flag.Bool("hide-local", false, "hide local devices")
2019
hideNetwork = flag.Bool("hide-network", false, "hide network devices")
2120
hideFuse = flag.Bool("hide-fuse", false, "hide fuse devices")
2221
hideSpecial = flag.Bool("hide-special", false, "hide special devices")
2322
hideLoops = flag.Bool("hide-loops", true, "hide loop devices")
2423
hideBinds = flag.Bool("hide-binds", true, "hide bind mounts")
2524

26-
sortBy = flag.String("sort", "mountpoint", "sort output by key (mountpoint, size, used, avail, usage, type, filesystem)")
25+
sortBy = flag.String("sort", "mountpoint", "sort output by: mountpoint, size, used, avail, usage, type, filesystem")
2726
width = flag.Uint("width", 0, "max output width")
2827

28+
inodes = flag.Bool("inodes", false, "list inode information instead of block usage")
2929
jsonOutput = flag.Bool("json", false, "output all devices in JSON format")
3030
)
3131

@@ -73,16 +73,16 @@ func renderTables(m []Mount, sortCol int) {
7373

7474
// print tables
7575
if !*hideLocal || *all {
76-
printTable("local", local, sortCol)
76+
printTable("local", local, sortCol, *inodes)
7777
}
7878
if !*hideNetwork || *all {
79-
printTable("network", network, sortCol)
79+
printTable("network", network, sortCol, *inodes)
8080
}
8181
if !*hideFuse || *all {
82-
printTable("FUSE", fuse, sortCol)
82+
printTable("FUSE", fuse, sortCol, *inodes)
8383
}
8484
if !*hideSpecial || *all {
85-
printTable("special", special, sortCol)
85+
printTable("special", special, sortCol, *inodes)
8686
}
8787
}
8888

mounts.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,19 @@ import (
99
)
1010

1111
type Mount struct {
12-
Device string `json:"device"`
13-
DeviceType string `json:"device_type"`
14-
Mountpoint string `json:"mount_point"`
15-
Fstype string `json:"fs_type"`
16-
Type string `json:"type"`
17-
Opts string `json:"opts"`
18-
Total uint64 `json:"total"`
19-
Free uint64 `json:"free"`
20-
Used uint64 `json:"used"`
21-
Stat unix.Statfs_t `json:"-"`
12+
Device string `json:"device"`
13+
DeviceType string `json:"device_type"`
14+
Mountpoint string `json:"mount_point"`
15+
Fstype string `json:"fs_type"`
16+
Type string `json:"type"`
17+
Opts string `json:"opts"`
18+
Total uint64 `json:"total"`
19+
Free uint64 `json:"free"`
20+
Used uint64 `json:"used"`
21+
InodesTotal uint64 `json:"inodes_total"`
22+
InodesFree uint64 `json:"inodes_free"`
23+
InodesUsed uint64 `json:"inodes_used"`
24+
Stat unix.Statfs_t `json:"-"`
2225
}
2326

2427
func readLines(filename string) ([]string, error) {

mounts_darwin.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,18 @@ func mounts() ([]Mount, []string, error) {
6767
}
6868

6969
d := Mount{
70-
Device: device,
71-
Mountpoint: mountPoint,
72-
Fstype: fsType,
73-
Type: fsType,
74-
Opts: opts,
75-
Stat: stat,
76-
Total: (uint64(stat.Blocks) * uint64(stat.Bsize)),
77-
Free: (uint64(stat.Bavail) * uint64(stat.Bsize)),
78-
Used: (uint64(stat.Blocks) - uint64(stat.Bfree)) * uint64(stat.Bsize),
70+
Device: device,
71+
Mountpoint: mountPoint,
72+
Fstype: fsType,
73+
Type: fsType,
74+
Opts: opts,
75+
Stat: stat,
76+
Total: (uint64(stat.Blocks) * uint64(stat.Bsize)),
77+
Free: (uint64(stat.Bavail) * uint64(stat.Bsize)),
78+
Used: (uint64(stat.Blocks) - uint64(stat.Bfree)) * uint64(stat.Bsize),
79+
InodesTotal: stat.Files,
80+
InodesFree: stat.Ffree,
81+
InodesUsed: stat.Files - stat.Ffree,
7982
}
8083
d.DeviceType = deviceType(d)
8184

mounts_linux.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,18 @@ func mounts() ([]Mount, []string, error) {
5454
}
5555

5656
d := Mount{
57-
Device: device,
58-
Mountpoint: mountPoint,
59-
Fstype: fstype,
60-
Type: fsTypeMap[int64(stat.Type)],
61-
Opts: mountOpts,
62-
Stat: stat,
63-
Total: (uint64(stat.Blocks) * uint64(stat.Bsize)),
64-
Free: (uint64(stat.Bavail) * uint64(stat.Bsize)),
65-
Used: (uint64(stat.Blocks) - uint64(stat.Bfree)) * uint64(stat.Bsize),
57+
Device: device,
58+
Mountpoint: mountPoint,
59+
Fstype: fstype,
60+
Type: fsTypeMap[int64(stat.Type)],
61+
Opts: mountOpts,
62+
Stat: stat,
63+
Total: (uint64(stat.Blocks) * uint64(stat.Bsize)),
64+
Free: (uint64(stat.Bavail) * uint64(stat.Bsize)),
65+
Used: (uint64(stat.Blocks) - uint64(stat.Bfree)) * uint64(stat.Bsize),
66+
InodesTotal: stat.Files,
67+
InodesFree: stat.Ffree,
68+
InodesUsed: stat.Files - stat.Ffree,
6669
}
6770
d.DeviceType = deviceType(d)
6871

table.go

Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import (
1111
)
1212

1313
var (
14-
columns = table.Row{"Mounted on", "Size", "Used", "Avail", "Use%", "Type", "Filesystem"}
15-
1614
colorRed = term.Color("#E88388")
1715
colorYellow = term.Color("#DBAB79")
1816
colorGreen = term.Color("#A8CC8C")
@@ -52,17 +50,25 @@ func stringToColumn(s string) (int, error) {
5250
case "mountpoint":
5351
return 1, nil
5452
case "size":
55-
return 8, nil
53+
return 12, nil
5654
case "used":
57-
return 9, nil
55+
return 13, nil
5856
case "avail":
59-
return 10, nil
57+
return 14, nil
6058
case "usage":
61-
return 11, nil
59+
return 15, nil
60+
case "inodes":
61+
return 16, nil
62+
case "inodes_used":
63+
return 17, nil
64+
case "inodes_avail":
65+
return 18, nil
66+
case "inodes_usage":
67+
return 19, nil
6268
case "type":
63-
return 6, nil
69+
return 10, nil
6470
case "filesystem":
65-
return 7, nil
71+
return 11, nil
6672

6773
default:
6874
return 0, fmt.Errorf("unknown column identifier: %s", s)
@@ -125,7 +131,7 @@ func barTransformer(val interface{}) string {
125131
return s.String()
126132
}
127133

128-
func printTable(title string, m []Mount, sortBy int) {
134+
func printTable(title string, m []Mount, sortBy int, inodes bool) {
129135
tab := table.NewWriter()
130136
tab.SetAllowedRowLength(int(*width))
131137
tab.SetOutputMirror(os.Stdout)
@@ -153,41 +159,59 @@ func printTable(title string, m []Mount, sortBy int) {
153159

154160
tab.SetColumnConfigs([]table.ColumnConfig{
155161
{Number: 1, WidthMax: int(float64(cols) * 0.4)},
156-
{Number: 2, Transformer: sizeTransformer, Align: text.AlignRight, AlignHeader: text.AlignRight},
157-
{Number: 3, Transformer: sizeTransformer, Align: text.AlignRight, AlignHeader: text.AlignRight},
158-
{Number: 4, Transformer: spaceTransformer, Align: text.AlignRight, AlignHeader: text.AlignRight},
159-
{Number: 5, Transformer: barTransformer, AlignHeader: text.AlignCenter},
160-
{Number: 6, WidthMax: int(float64(cols) * 0.2)},
161-
{Number: 7, WidthMax: int(float64(cols) * 0.4)},
162-
{Number: 8, Hidden: true}, // sortBy helper for size
163-
{Number: 9, Hidden: true}, // sortBy helper for used
164-
{Number: 10, Hidden: true}, // sortBy helper for avail
165-
{Number: 11, Hidden: true}, // sortBy helper for usage
162+
{Number: 2, Hidden: inodes, Transformer: sizeTransformer, Align: text.AlignRight, AlignHeader: text.AlignRight},
163+
{Number: 3, Hidden: inodes, Transformer: sizeTransformer, Align: text.AlignRight, AlignHeader: text.AlignRight},
164+
{Number: 4, Hidden: inodes, Transformer: spaceTransformer, Align: text.AlignRight, AlignHeader: text.AlignRight},
165+
{Number: 5, Hidden: inodes, Transformer: barTransformer, AlignHeader: text.AlignCenter},
166+
{Number: 6, Hidden: !inodes, Align: text.AlignRight, AlignHeader: text.AlignRight},
167+
{Number: 7, Hidden: !inodes, Align: text.AlignRight, AlignHeader: text.AlignRight},
168+
{Number: 8, Hidden: !inodes, Align: text.AlignRight, AlignHeader: text.AlignRight},
169+
{Number: 9, Hidden: !inodes, Transformer: barTransformer, AlignHeader: text.AlignCenter},
170+
{Number: 10, WidthMax: int(float64(cols) * 0.2)},
171+
{Number: 11, WidthMax: int(float64(cols) * 0.4)},
172+
{Number: 12, Hidden: true}, // sortBy helper for size
173+
{Number: 13, Hidden: true}, // sortBy helper for used
174+
{Number: 14, Hidden: true}, // sortBy helper for avail
175+
{Number: 15, Hidden: true}, // sortBy helper for usage
176+
{Number: 16, Hidden: true}, // sortBy helper for inodes size
177+
{Number: 17, Hidden: true}, // sortBy helper for inodes used
178+
{Number: 18, Hidden: true}, // sortBy helper for inodes avail
179+
{Number: 19, Hidden: true}, // sortBy helper for inodes usage
166180
})
167181

168-
tab.AppendHeader(columns)
182+
tab.AppendHeader(table.Row{"Mounted on", "Size", "Used", "Avail", "Use%", "Inodes", "Used", "Avail", "Use%", "Type", "Filesystem"})
169183

170184
for _, v := range m {
171185
// spew.Dump(v)
172186

173-
// render progress-bar
174-
var usage float64
187+
var usage, inodeUsage float64
175188
if v.Total > 0 {
176189
usage = float64(v.Used) / float64(v.Total)
177190
}
191+
if v.InodesTotal > 0 {
192+
inodeUsage = float64(v.InodesUsed) / float64(v.InodesTotal)
193+
}
178194

179195
tab.AppendRow([]interface{}{
180196
termenv.String(v.Mountpoint).Foreground(colorBlue), // mounted on
181-
v.Total, // size
182-
v.Used, // used
183-
v.Free, // avail
184-
usage, // use%
197+
v.Total, // size
198+
v.Used, // used
199+
v.Free, // avail
200+
usage, // use%
201+
v.InodesTotal, // size
202+
v.InodesUsed, // used
203+
v.InodesFree, // avail
204+
inodeUsage, // use%
185205
termenv.String(v.Fstype).Foreground(colorGray), // type
186206
termenv.String(v.Device).Foreground(colorGray), // filesystem
187-
v.Total, // size sorting helper
188-
v.Used, // used sorting helper
189-
v.Free, // avail sorting helper
190-
usage, // use% sorting helper
207+
v.Total, // size sorting helper
208+
v.Used, // used sorting helper
209+
v.Free, // avail sorting helper
210+
usage, // use% sorting helper
211+
v.InodesTotal, // size sorting helper
212+
v.InodesUsed, // used sorting helper
213+
v.InodesFree, // avail sorting helper
214+
inodeUsage, // use% sorting helper
191215
})
192216
}
193217

@@ -203,7 +227,7 @@ func printTable(title string, m []Mount, sortBy int) {
203227

204228
//tab.AppendFooter(table.Row{fmt.Sprintf("%d %s", tab.Length(), title)})
205229
sortMode := table.Asc
206-
if sortBy >= 8 && sortBy <= 11 {
230+
if sortBy >= 12 {
207231
sortMode = table.AscNumeric
208232
}
209233

0 commit comments

Comments
 (0)