![pcmanfm 的“弹出 USB 驱动器”操作](https://linux22.com/image/981457/pcmanfm%20%E7%9A%84%E2%80%9C%E5%BC%B9%E5%87%BA%20USB%20%E9%A9%B1%E5%8A%A8%E5%99%A8%E2%80%9D%E6%93%8D%E4%BD%9C.png)
我想知道是否有办法在 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
不是对象路径。
使用此命令查找对象路径:
$ 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';
通过以下方式获取节点
/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
并使用
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 []