文件系统使用指示器

Din*_*san 10 indicator partitioning disk-usage tools

我找不到合适的实用程序来仅在面板上指示文件系统使用情况(分区可用空间百分比)。

而且我不期待安装任何糟糕的桌面管理工具,而是一个简单的指示器。

我感谢您的所有建议。

Jac*_*ijm 19

编辑:

1. 新答案

虽然可以使用此答案底部的答案(请参阅参考资料[2.]),但它会导致一个ppa带有附加选项的-version,可在首选项窗口中进行设置。

在此处输入图片说明

在此处输入图片说明

选项包括:

  • 在一个窗口中设置所有别名
  • 设置面板图标的主题颜色:

    在此处输入图片说明在此处输入图片说明在此处输入图片说明在此处输入图片说明

  • 设置警告阈值
  • 在通知中显示有关新安装/连接的卷的信息:

    在此处输入图片说明

  • 在启动时运行

此外,指示器现在包括为其他发行版(如 xfce)设置的较小(宽度)图标,它将根据窗口管理器自动应用。

在此处输入图片说明

安装:

sudo add-apt-repository ppa:vlijm/spaceview
sudo apt-get update
sudo apt-get install spaceview
Run Code Online (Sandbox Code Playgroud)



2. 旧答案

下面的脚本是一个指标,列出您的设备并显示它们的使用情况。信息每十秒更新一次(如有必要)。

在此处输入图片说明

此外

  • 在指示器运行时,您可以选择要在图标中表示的设备。下次运行指标时将记住该设备:

    在此处输入图片说明

    ![在此处输入图片说明

    在此处输入图片说明

  • 对于一个或多个(或所有)设备,您可以设置替代名称(“自定义名称”),以在脚本的头部设置

    举个例子,这个:

    sudo add-apt-repository ppa:vlijm/spaceview
    sudo apt-get update
    sudo apt-get install spaceview
    
    Run Code Online (Sandbox Code Playgroud)

    将会呈现:

    在此处输入图片说明

  • 您可以设置一个阈值;如果您的任一设备的可用空间低于此值,您将收到警告:

    在此处输入图片说明

  • 插入/拔出的设备将在 10 秒内从菜单列表中添加/删除。

剧本

alias = [
    ["sdc1", "stick"],
    ["sdb1", "External"],
    ["sda2", "root"],
    ["sda4", "ntfs1"],
    ["sda5", "ntfs2"],
    ["//192.168.0.104/media", "netwerk media"],
    ["//192.168.0.104/werkmap_documenten", "netwerk docs"],
    ]
Run Code Online (Sandbox Code Playgroud)

图标

在此处输入图片说明 0.png

在此处输入图片说明 1.png

在此处输入图片说明 2.png

在此处输入图片说明 3.png

在此处输入图片说明 4.png

在此处输入图片说明 5.png

在此处输入图片说明 6.png

在此处输入图片说明 7.png

在此处输入图片说明 8.png

在此处输入图片说明 9.png

在此处输入图片说明 10.png

配置

设置很简单:

  • 将脚本复制到一个空文件中,另存为 showusage.py
  • 将上面的图标(与它们的标签完全相同)保存到与脚本相同的目录中(右键单击 > 另存为)
  • 在脚本的头部,设置(可能的)替代名称 ( aliasses)。下面是一个例子:

    #!/usr/bin/env python3
    import subprocess
    import os
    import time
    import signal
    import gi
    gi.require_version('Gtk', '3.0')
    gi.require_version('AppIndicator3', '0.1')
    from gi.repository import Gtk, AppIndicator3, GObject
    from threading import Thread
    
    #--- set alias names below in the format [[device1, alias1], [device2, alias2]]
    #--- just set alias = [] to have no custom naming
    alias = []
    #--- set the threshold to show a warning below 
    #--- set to 0 to have no warning
    threshold = 17
    #---
    currpath = os.path.dirname(os.path.realpath(__file__))
    prefsfile = os.path.join(currpath, "showpreferred")
    
    class ShowDevs():
        def __init__(self):
            self.default_dev = self.get_showfromfile()
            self.app = 'show_dev'
            iconpath = currpath+"/0.png"
            self.indicator = AppIndicator3.Indicator.new(
                self.app, iconpath,
                AppIndicator3.IndicatorCategory.OTHER)
            self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
            self.indicator.set_menu(self.create_menu())
            self.indicator.set_label("Starting up...", self.app)
            self.update = Thread(target=self.check_changes)
            self.update.setDaemon(True)
            self.update.start()
    
        def check_changes(self):
            state1 = None
            while True:
                self.state2 = self.read_devices()
                if self.state2 != state1:
                    self.update_interface(self.state2)
                state1 = self.state2
                time.sleep(10)
    
        def update_interface(self, state):
            warning = False; self.newmenu = []
            for dev in state:
                mention = self.create_mention(dev)
                name = mention[0]; deci = mention[2]; n = mention[1]
                if n <= threshold:
                    warning = True
                try:
                    if self.default_dev in name:
                        newlabel = mention[3]
                        newicon = currpath+"/"+str(10-deci)+".png"
                except TypeError:
                    pass
                self.newmenu.append(name+" "+str(n)+"% free")
            if warning:
                newlabel = "Check your disks!"
                newicon = currpath+"/10.png"
            try:
                self.update_indicator(newlabel, newicon)
            except UnboundLocalError:
                labeldata = self.create_mention(state[0])
                newlabel = labeldata[3]
                newicon = currpath+"/"+str(10-labeldata[2])+".png"
                self.update_indicator(newlabel, newicon)
            GObject.idle_add(self.set_new, 
                priority=GObject.PRIORITY_DEFAULT)  
    
        def update_indicator(self, newlabel, newicon):
            GObject.idle_add(self.indicator.set_label,
                newlabel, self.app,
                priority=GObject.PRIORITY_DEFAULT)   
            GObject.idle_add(self.indicator.set_icon,
                newicon,
                priority=GObject.PRIORITY_DEFAULT)
    
        def set_new(self):
            for i in self.initmenu.get_children():
                self.initmenu.remove(i)
            for item in self.newmenu:
                add = Gtk.MenuItem(item)
                add.connect('activate', self.change_show)
                self.initmenu.append(add) 
            menu_sep = Gtk.SeparatorMenuItem()
            self.initmenu.append(menu_sep)
            self.item_quit = Gtk.MenuItem('Quit')
            self.item_quit.connect('activate', self.stop)
            self.initmenu.append(self.item_quit)
            self.initmenu.show_all()
    
        def change_show(self, *args):
            index = self.initmenu.get_children().index(self.initmenu.get_active())
            self.default_dev = self.newmenu[index].split()[0]
            open(prefsfile, "wt").write(self.default_dev)
            self.update_interface(self.read_devices())
    
        def create_mention(self, dev):
            name = dev[1] if dev[1] else dev[0]
            n = dev[2]; deci = round(dev[2]/10)
            newlabel = name+" "+str(n)+"% free"
            return (name, n, deci, newlabel)        
    
        def create_menu(self):
            # create initial basic menu
            self.initmenu = Gtk.Menu()
            self.item_quit = Gtk.MenuItem('Quit')
            self.item_quit.connect('activate', self.stop)
            self.initmenu.append(self.item_quit)
            self.initmenu.show_all()
            return self.initmenu
    
        def read_devices(self):
            # read the devices, look up their alias and the free sapace
            devdata = []
            data = subprocess.check_output(["df", "-h"]).decode("utf-8").splitlines()
            relevant = [l for l in data if all([
                        any([l.startswith("/dev/"), l.startswith("//")]),
                        not "/loop" in l])
                        ]
            for dev in relevant:
                data = dev.split(); name = data[0]; pseudo = None       
                free = 100-int([s.strip("%") for s in data if "%" in s][0])
                for al in alias:
                    if al[0] in name:
                        pseudo = al[1]
                        break
                devdata.append((name, pseudo, free)) 
            return devdata
    
        def get_showfromfile(self):
            # read the preferred default device from file
            try:
                defdev = open(prefsfile).read().strip()
            except FileNotFoundError:
                defdev = None
            return defdev
    
        def stop(self, source):
            Gtk.main_quit()
    
    ShowDevs()
    GObject.threads_init()
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    Gtk.main()
    
    Run Code Online (Sandbox Code Playgroud)

    如果要显示设备不变,请使用:

    alias = [
        ["sda2", "root"],
        ["sdb1", "External"]
        ]
    
    Run Code Online (Sandbox Code Playgroud)

    ...如果需要,请更改阈值以显示警告:

    alias = []
    
    Run Code Online (Sandbox Code Playgroud)

    就是这样

运行它

要使用指标,请运行以下命令:

python3 /path/to/showusage.py
Run Code Online (Sandbox Code Playgroud)

要将其添加到启动应用程序,请使用以下命令:

/bin/bash -c "sleep 10 && python3 /path/to/showusage.py"
Run Code Online (Sandbox Code Playgroud)

选择应用程序:Dash > 启动应用程序 > 添加,添加上面的命令。


Ser*_*nyy 16

免责声明:我是这个指标的作者,它是为这个特定问题而写的

2018 年 10 月 23 日更新

该指标现在支持 列出网络共享。感谢mihaigalos

2016 年 10 月 29 日更新

该指示器现在具有卸载功能,并且通过引用每个分区的 UUID 而不是块设备名称(例如sda1. 查看相关的错误报告

2016 年 10 月 8 日更新

该指标现在是 2.0 版,添加了一些功能并拥有自己的 PPA。

要从 PPA 安装,请在终端中使用以下步骤:

  1. sudo apt-add-repository ppa:udisks-indicator-team/ppa
  2. sudo bash -c 'apt-get update && apt-get install udisks-indicator'

发行说明中所述,这些功能包括:

  • 菜单项的图标:每个分区/设备都有相应的图标。如果设备是 usb 磁盘,则使用可移动媒体图标,如果是 iso 映像 - 使用光盘图标,显然硬盘驱动器/SSD 分区有驱动器图标。
  • 现在使用百分比和人类可读的值(1024 的幂)显示。
  • 通过使用栏的使用图形表示(非常感谢 Mateo Salta 的想法)
  • 首选项对话框:用户可以关闭他们不想在每个菜单条目中看到的某些字段。如果附加了大量分区,这允许保持指示器菜单清洁。(感谢 Zacharee 的请求)
  • 文本间距:使用默认的 Ubuntu 字体和 Monospace 字体,文本条目的间距很好,以具有更清晰的外观并增强信息的可读性。
  • 无法挂载分区时的通知气泡

下面是带有默认 Ubuntu 图标主题的屏幕截图: 在此处输入图片说明

优麒麟图标主题

在此处输入图片说明

关闭所有可选字段

在此处输入图片说明

设计选择和其他想法:

在制作这个指标时,我希望实现一个既适合高级用户也适合普通用户的实用程序。我试图解决一些我注意到的新用户在处理命令行工具时可能遇到的问题。此外,该实用程序力求实现多用途。

首选项对话框允许根据用户的需要使指标变得复杂和/或简单。避免在顶部面板中放置标签也是一个特定的设计决策,这样它就不会占用太多用户的顶部面板空间。此外,该指标力求成为多用途实用程序,允许安装分区以及打开它们各自的目录。这不仅可以用作磁盘使用实用程序,还可以用作快速打开目录的导航实用程序。

用户还可以方便地知道哪个分区位于哪个磁盘,从而避免与通过命令行实用程序(如mount. 相反,它udisksctl用于该目的(以及从UDisks2守护进程获取信息,因此命名)。它不执行的唯一任务是 unmounting ,或者这个原因包括Open Disks Utility菜单项。

虽然最初我努力使其与 iStat menulet 类似,但该项目偏离了这一目标 - 该指标在其设计和目的方面是独一无二的。我希望它对许多用户有用,并使他们的 Ubuntu 体验更加愉快。


udisks-indicator(原始答案)

带有 Unity 桌面的 Ubuntu 指示器,用于显示磁盘使用情况 示例截图

概述

带有 Unity 的 Ubuntu 指示器可以轻松查看有关已安装分区的信息。它力求在视觉上与 OS X 的 iStat Menu 3 menulet 相似。

条目按顺序排列:

  • 划分
  • 别名(如果由用户设置)
  • 分区所属的磁盘驱动器
  • 分区的挂载点(目录)
  • % 用法

单击每个分区条目将在默认文件管理器中打开分区的挂载点

“Unmounted Partitions”菜单列出了系统当前未安装的所有分区。单击该子菜单中的任何条目将自动挂载该分区,通常挂载到/media/username/drive-id文件夹

该指标使用系统提供的默认图标,因此当您使用 Unity Tweak Tool 或其他方法更改图标主题时,图标应该会发生变化

注意:如果您想同时添加多个别名,而不是通过“Make Alias”选项一个一个地添加,您可以通过编辑~/.partition_aliases.json配置文件来实现。格式如下:

{
    "sda1": "Alias 1",
    "sda2": "Alias 2",
    "sdb1": "Alias 3"
}
Run Code Online (Sandbox Code Playgroud)

安装

易于安装的 PPA 即将推出。. .

同时,以下是替代步骤:

  1. cd /tmp
  2. wget https://github.com/SergKolo/udisks-indicator/archive/master.zip
  3. unzip master.zip
  4. sudo install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
  5. sudo install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop

所有这些步骤都可以放在一个漂亮的小安装脚本中:

#!/bin/bash

cd /tmp
rm master.zip*
wget https://github.com/SergKolo/udisks-indicator/archive/master.zip
unzip master.zip
install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop
Run Code Online (Sandbox Code Playgroud)

源代码

可以在下面找到具有该指标基本功能的原始源代码(版本 v1.0)。有关最新功能,请查看此项目的 GitHub 存储库。请在 GitHub 上报告任何功能请求和错误。

/usr/bin/udisks-indicator

{
    "sda1": "Alias 1",
    "sda2": "Alias 2",
    "sdb1": "Alias 3"
}
Run Code Online (Sandbox Code Playgroud)

/usr/share/applications/udisks-indicator.desktop

[Desktop Entry]
Version=1.0
Name=Udisks Indicator
Comment=Indicator for reporting partition information
Exec=udisks-indicator
Type=Application
Icon=drive-harddisk-symbolic.svg
Terminal=false
Run Code Online (Sandbox Code Playgroud)

附加信息:

Ubuntu Mate 16.04 测试:

在此处输入图片说明

Gnome 用户需要一个扩展(KStatusNotifierItem/AppIndicator Support)来使指标正常运行:

在此处输入图片说明