Golang磁盘空间分析工具 - Tdu v1.30 使用指南

Golang磁盘空间分析工具 - Tdu v1.30 使用指南 您想知道是什么占用了您的所有磁盘空间吗?

自版本1.26以来的新功能:

  • 改进对Windows的支持,已在Amd64架构的Windows 7、8、10上测试。
  • [Windows] 控制台清屏和调整大小,启用回滚。
  • 显示扫描进度
  • 将结果导出为Ncdu JSON格式(https://dev.yorhel.nl/ncdu/jsonfmt
  • 添加手册页

功能:

  • 显示按大小排序的最大文件夹和文件列表及其百分比
  • 显示当前分区的信息
  • 统计目录、文件、符号链接、硬链接、套接字、管道、目录深度…
  • 查找最深的目录,最长的文件路径
  • 许可证:GNU GPL

请发送您的反馈和建议! macOS 和 FreeBSD 的开发者们,我需要你们的帮助。

适用于 Linux 和 Windows 的即用型软件包位于:https://bitbucket.org/josephpaul0/tdu/downloads/ 源代码:https://bitbucket.org/josephpaul0/tdu

图片

图片

josephpaul0 / tdu

Top Disk Usage (GNU GPL). 您想知道是什么占用了您的所有磁盘空间吗? 此命令行工具估算给定路径中所有文件占用的磁盘空间。它显示按大小排序的最大项目列表。估算方法类似于…


更多关于Golang磁盘空间分析工具 - Tdu v1.30 使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang磁盘空间分析工具 - Tdu v1.30 使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是关于 Tdu v1.30 磁盘空间分析工具的专业使用指南,基于其功能和 Go 语言实现原理。我将提供示例代码片段来演示如何实现类似功能,但请注意,这些代码是独立的示例,并非直接来自 Tdu 源代码。

核心功能实现示例

Tdu 工具的核心是递归扫描目录并计算文件大小,然后排序和显示结果。以下是一个简化的 Go 代码示例,展示如何实现基本的磁盘空间分析。

示例 1:递归扫描目录并计算大小

这个示例演示了如何使用 Go 的 filepath.Walk 函数遍历目录,并统计文件和目录的大小。Tdu 可能使用类似方法,但优化了性能和跨平台支持。

package main

import (
    "fmt"
    "os"
    "path/filepath"
    "sort"
)

type FileInfo struct {
    Path string
    Size int64
}

func main() {
    root := "." // 指定扫描路径,例如 "/" 或 "C:\\"
    var files []FileInfo

    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return nil // 忽略错误,继续扫描
        }
        if !info.IsDir() {
            files = append(files, FileInfo{
                Path: path,
                Size: info.Size(),
            })
        }
        return nil
    })

    if err != nil {
        fmt.Printf("扫描错误: %v\n", err)
        return
    }

    // 按大小降序排序
    sort.Slice(files, func(i, j int) bool {
        return files[i].Size > files[j].Size
    })

    // 显示前10个最大文件
    fmt.Println("最大文件列表:")
    for i, file := range files[:10] {
        fmt.Printf("%d. %s - %d 字节\n", i+1, file.Path, file.Size)
    }
}

示例 2:计算目录总大小和百分比

Tdu 显示百分比,这需要计算总磁盘使用量。以下代码扩展了上述示例,添加了百分比计算。

package main

import (
    "fmt"
    "os"
    "path/filepath"
    "sort"
)

type Item struct {
    Path string
    Size int64
    Percentage float64
}

func main() {
    root := "."
    var items []Item
    var totalSize int64

    // 第一遍扫描:计算总大小
    filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        if err != nil || info.IsDir() {
            return nil
        }
        totalSize += info.Size()
        return nil
    })

    // 第二遍扫描:收集文件并计算百分比
    filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        if err != nil || info.IsDir() {
            return nil
        }
        percentage := (float64(info.Size()) / float64(totalSize)) * 100
        items = append(items, Item{
            Path:       path,
            Size:       info.Size(),
            Percentage: percentage,
        })
        return nil
    })

    // 按大小排序
    sort.Slice(items, func(i, j int) bool {
        return items[i].Size > items[j].Size
    })

    fmt.Printf("总大小: %d 字节\n", totalSize)
    fmt.Println("文件和目录列表(按大小排序):")
    for i, item := range items {
        if i >= 10 { // 限制输出数量
            break
        }
        fmt.Printf("%d. %s - %d 字节 (%.2f%%)\n", i+1, item.Path, item.Size, item.Percentage)
    }
}

示例 3:导出为 Ncdu JSON 格式

Tdu 支持导出为 Ncdu JSON 格式。以下代码展示了如何生成兼容的 JSON 结构。

package main

import (
    "encoding/json"
    "fmt"
    "os"
    "path/filepath"
)

type NcduEntry struct {
    Name     string      `json:"name"`
    Size     int64       `json:"dsize"`
    DiskUsage int64      `json:"asize"`
    Type     string      `json:"type"` // "file" 或 "directory"
    Items    []NcduEntry `json:"items,omitempty"`
}

func scanDirectory(path string) (NcduEntry, error) {
    info, err := os.Stat(path)
    if err != nil {
        return NcduEntry{}, err
    }

    entry := NcduEntry{
        Name:     info.Name(),
        Size:     info.Size(),
        DiskUsage: info.Size(),
        Type:     "file",
    }

    if info.IsDir() {
        entry.Type = "directory"
        files, err := os.ReadDir(path)
        if err != nil {
            return entry, err
        }
        for _, file := range files {
            subEntry, err := scanDirectory(filepath.Join(path, file.Name()))
            if err != nil {
                continue
            }
            entry.Items = append(entry.Items, subEntry)
            entry.DiskUsage += subEntry.DiskUsage // 累加目录大小
        }
    }
    return entry, nil
}

func main() {
    root := "."
    data, err := scanDirectory(root)
    if err != nil {
        fmt.Printf("错误: %v\n", err)
        return
    }

    jsonData, err := json.MarshalIndent([]NcduEntry{data}, "", "  ")
    if err != nil {
        fmt.Printf("JSON 编码错误: %v\n", err)
        return
    }

    fmt.Println("Ncdu JSON 导出:")
    fmt.Println(string(jsonData))
}

使用说明

  • 跨平台支持:Tdu 使用 Go 的标准库(如 osfilepath),这些库已针对 Windows、Linux 和 macOS 优化。例如,在 Windows 上,路径分隔符会自动处理。
  • 性能优化:Tdu 可能采用并发扫描(例如使用 goroutines)来提高速度,但上述示例未包含此部分以保持简洁。
  • 安装和运行:从提供的 Bitbucket 链接下载预编译二进制文件,或使用 go get 命令从源代码构建(如果仓库支持)。

这些示例代码演示了 Tdu 的核心功能,实际工具可能包含更多错误处理、进度显示和导出选项。如果您在使用 Tdu 时遇到具体问题,例如扫描特定目录或导出格式,可以提供更多细节以获取针对性帮助。

回到顶部