pcmanfm 的“弹出 USB 驱动器”操作

pcmanfm 的“弹出 USB 驱动器”操作

我想知道是否有办法在 lubuntu 中创建自定义 pcmanfm 操作来弹出 usb 驱动器?我尝试过这样做udisksctl但该--object-path选项给了我这个错误:

(udisksctl unmount:10926): GLib-GIO-CRITICAL **: g_dbus_object_manager_get_object: assertion 'g_variant_is_object_path (object_path)' failed
Error looking up object with path /media/user/Flash-Drive

并且简单文件夹和已安装驱动器之间的 MIME 类型没有区别,因此所有文件夹上都会显示“弹出”操作。

更新

好吧,看来我找到了某种解决方案。这将卸载并关闭你的 USB 驱动器

[Desktop Entry]
Type=Action
Tooltip=Eject selected flash drive
Name=Eject flash drive
Profiles=profile-zero;
Icon=media-eject

[X-Action-Profile profile-zero]
MimeTypes=inode/directory;
Exec=gksudo eject %f
Name=Default profile

setuid您还可以在添加到后无需 gksudo 提示即可使用它/usr/bin/eject

[Desktop Entry]
Type=Action
Tooltip=Eject selected flash drive
Name=Eject flash drive
Profiles=profile-zero;
Icon=media-eject

[X-Action-Profile profile-zero]
MimeTypes=inode/directory;
Exec=eject %f
Name=Default profile

但此操作将显示在所有文件夹上。我仍然不知道如何区分 usb 驱动器目录和闪存驱动器目录。我见过Basenames.desktop 条目的规范,它指定选定的文件名(用于清空垃圾动作)那么是否有某种方法可以指定文件的位置?

更新 2

好的,我已找到合适的 MIME 类型MIME 信息数据库- inode/mount-point,但现在操作根本没有显示在任何目录上。什么可能导致问题?

[Desktop Entry]
Type=Action
Tooltip=Eject selected drive
Name=Eject drive
Profiles=profile-zero;
Icon=media-eject

[X-Action-Profile profile-zero]
MimeTypes=inode/mount-point
Exec=eject %f
Name=Default profile

答案1

我的建议是使用umount命令。

使用fdisk -l命令并插入不同的 usb 驱动器确定为已识别, 说他们是/dev/sdd1

在创建操作(file.desktop)之前,请创建其目录:

mkdir -p ~/.local/share/file-manager/actions

逐个使用以下终端命令来创建并编辑操作文件 (umount.desktop):

touch ~/.local/share/file-manager/actions/umount.desktop
nano ~/.local/share/file-manager/actions/umount.desktop

将以下内容粘贴到 umount.desktop 中:

[Desktop Entry]
Type=Action
Name=Eject Usb-Drive
Icon=dialog-password
Profiles=profile-zero;

[X-Action-Profile profile-zero]
Exec=umount /dev/sdd1
Name=Default profile

答案2

我在这方面取得了更多进展,但解决方案仍然不理想:
我正在使用 Lubuntu 16.04 和 PCManFM 1.24。对于 USB 笔式驱动器,我得到“弹出可移动媒体”,但对于 USB 磁盘驱动器,我没有得到“安全移除驱动器”,就像在 Nautilus 中一样(我只能得到卸载)。
第一个问题是获取设备上的右键单击上下文,不幸的是,PCManFM 左窗格中的设备似乎不支持操作,(或 Nautilus,但 Nemo 中的操作在左窗格中有效,但 Nemo 中的操作实现方式不同)。我有一个解决这个问题的方法,通过在编辑-首选项-布局中的“在位置显示”下勾选“设备”,在左窗格中显示“设备”图标,然后您可以在右窗格中右键单击设备,如附加链接所示: pcmanfm 设备右键单击图像

第二个问题是安全移除驱动器的脚本:上例中传递给操作脚本的参数是:computer:///ST1000LM010-9YH146.drive(或者只是带有 %w 的 ST1000LM010-9YH146),这并不理想 - 我不认为它均匀唯一地标识驱动器,因为它不包含序列号。以下是“udisksctl status”的输出:

$ udisksctl status
MODEL                     REVISION  SERIAL               DEVICE
--------------------------------------------------------------------------
WDC WD5000BEVT-22ZAT0     01.01A01  WD-WX70A9903180      sda
Kingston DataTraveler G3  1.00      001CC0EC31D0F081F6071284 sdb
ST1000LM010-9YH146        CC9F      W2M076TD             sdc 

因此我的脚本与模型相匹配,因此假设您没有插入 2 个相同的设备来拾取设备。要实现脚本,请创建文件 ~/.local/share/filemanager/actions/eject.desktop,
其中包含:

[Desktop Entry]
Type=Action
Name=Safely Remove Drive
Icon=drive-harddisk-usb
Profiles=profile-zero;

[X-Action-Profile profile-zero]
MimeTypes=inode/mount-point
Exec=/home/mike/.local/share/file-manager/actions/eject.sh %w 
Name=Default profile

我已将脚本 jet.sh(由“Exec”指定)放在 ~/.local/share/filemanager/actions 中,但请注意,您不能在桌面文件中使用“~”或“$HOME”,因此您必须像我上面所做的那样指定完整路径

脚本eject.sh应该包含:

device=`udisksctl status | awk -v d=$1 '
BEGIN {
    gsub("%20"," ",d)
    sub("$"," ",d)  # Add a space on the end to give a more exact match
    sub("^","^",d) # Add ^ to start to give a more exact match
    }
$0 ~ d {
    print "/dev/"$NF
    }' `
if [ "$device" == "/dev" ]
then
    echo "Removable device not found"
else
    for dev in `df | awk -v device=$device '$1 ~ device {print $1}' `
    do
        echo "Unmounting "$dev
        udisksctl unmount -b $dev
    done

    echo "Powering off: "$device
    udisksctl power-off -b $device
fi

答案3

这个答案确实使用了 pcmanfm,但我发现它是最方便的。TL;DR; 使用 lxpanel 向 gnome-disks 添加图标。

详细信息:

在 lxpanel 中右键单击并选择“添加/删除面板项”。添加一个新的“应用程序启动栏”并将其放置在应该已经存在的“数字时钟”之前(或附近)。在新添加的“应用程序启动栏”中,将“首选项/磁盘”添加为应用程序。这是 Lubuntu 附带的 gnome-disks 应用程序。

如果您需要对磁盘进行某些操作,只需单击面板中的“磁盘”图标即可。从顶部菜单中选择磁盘并关闭电源。

这与 Windows 操作系统中的“安全删除硬件”一样方便,并且上面将其放置在与 Windows 桌面上大致相同的位置。

答案4

您的命令

udisksctl unmount --object-path /media/user/Flash-Drive

是错的。

/media/user/Flash-Drive不是对象路径。


  1. 使用此命令查找对象路径:

    $ gdbus introspect --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices --recurse --only-properties | grep -E "(readonly .+ (Device(IsMounted|IsDrive|File|MountPaths) ).*|\}|.*\{)" | awk -v RS="};" '/Flash-Drive/'
    
      node /org/freedesktop/UDisks/devices/sdc1 {
        interface org.freedesktop.UDisks.Device {
            readonly as DeviceMountPaths = ['/media/user/Flash-Drive'];
            readonly b DeviceIsMounted = true;
            readonly b DeviceIsDrive = false;
            readonly s DeviceFile = '/dev/sdc1';
    
  2. 通过以下方式获取节点/org/freedesktop/UDisks/devices/sdc1

    '/\/media\/user\/Flash-Drive/'用您的路径替换)。

    $ gdbus introspect --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices --recurse --only-properties | grep -E "(readonly .+ (Device(IsMounted|IsDrive|File|MountPaths) ).*|\}|.*\{)" | awk -v RS="};" '/\/media\/user\/Flash-Drive/' | awk '/node/ {print $2}'
    
    /org/freedesktop/UDisks/devices/sdc1
    
  3. 并使用

    gdbus call --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices/sdc1 --method org.freedesktop.UDisks.Device.FilesystemUnmount []
    

    或者作为 AllInOne (替换'/\/media\/user\/Flash-Drive/'为您的路径):

    gdbus call --system --dest org.freedesktop.UDisks --object-path $(gdbus introspect --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices --recurse --only-properties | grep -E "(readonly .+ (Device(IsMounted|IsDrive|File|MountPaths) ).*|\}|.*\{)" | awk -v RS="};" '/\/media\/user\/Flash-Drive/' | awk '/node/ {print $2}') --method org.freedesktop.UDisks.Device.FilesystemUnmount []
    

相关内容