无法在通过GVFS挂载的MTP设备上执行文件操作:“不支持该操作”


13

我正在运行64位Linux Mint 17.1(基于Ubuntu 14.04)。自从Linux Mint 14 / Ubuntu 12.10升级以来,我用来将音乐同步到Walkman的Python脚本已停止工作。

以前,当我安装Walkman时,它会自动显示为路径,/run/user/1000/gvfs/WALKMAN/Storage Media并且可以像其他任何文件系统一样工作:我可以通过Python将其复制,删除轨道等。但是,我不记得是否需要进行任何更改才能使这种情况发生。

自从升级到Linux Mint 17(以及现在的17.1)以来,当我安装Walkman时,它会显示为path /run/user/1000/gvfs/mtp:host=%5Busb%3A002%2C007%5D/Storage Media。此外,当我尝试运行相同的文件操作时,它们现在会失败。我发现这不仅通过Python发生,而且也在命令行上发生。例如:

david@MILTON:~$ cp '/data/Music/10SecsWhiteNoise.mp3' '/run/user/1000/gvfs/mtp:host=%5Busb%3A002%2C006%5D/Storage Media/MUSIC'
cp: cannot create regular file ‘/run/user/1000/gvfs/mtp:host=%5Busb%3A002%2C006%5D/Storage Media/MUSIC/10SecsWhiteNoise.mp3’: Operation not supported

我已经对此问题进行了一些研究,但是最常见的解释似乎是该PPA以前解决了该问题: https://launchpad.net/~langdalepl/+archive/ubuntu/gvfs-mtp

但是现在,自13.10起的Ubuntu版本包含所有这些更改,因此不再需要。那么,为什么我仍然有这些错误?我仍然可以通过图形文件管理器(在Linux Mint上为Caja)在Walkman上进行文件操作,而不必通过命令行。


我认为它可以为您提供帮助:github.com/hanwen/go-mtpfs
PersianGulf 2015年

我的设备已经挂载为MTP ...那不是问题。
David Pitchford 2015年

Answers:


15

一个猜测:您现在实际上正在使用MTP来访问Walkman,而MTP很烂。

细节

Operation not supported错误可能表明您的Walkman使用的MTP实现不支持“直接”访问。根据http://intr.overt.org/blog/?p=174,这种直接访问是特定于Android的扩展,因此您的Walkman可能不支持该扩展。

结果,您只能使用几种选定的方式来使用MTP访问Walkman上的文件:我猜这些操作都支持在单个操作中读取或写入文件的所有内容,而这些MTP实现不支持访问文件的选定部分。 。而且看来,cpPython始终使用后一种访问方法,因此失败。

可能的解决方法

但是,您可能能够只需更换cpgvfs-copy。在我使用三星Android手机(也具有严重的MTP实现)的测试中gvfs-copy,能够将文件复制到cp失败的手机中。

背景

我找不到有关这些与设备有关的MTP限制的太多信息;以下是一些片段,其中对情况做了一些解释:

/ubuntu//a/284831 https://bugs.launchpad.net/ubuntu/+source/gvfs/+bug/1389001/comments/2 https://bugs.launchpad.net/ubuntu/+source / gvfs / + bug / 1157583 / comments / 1

为什么以前能奏效?

关于为什么可以cp在Mint 14中访问Walkman 而不在Mint 17 中访问Walkman的原因,这可能是由于从PTPMTP作为访问系统的内部切换所致。从Ubuntu 12.04切换到14.04时,至少我注意到了三星设备。该手机同时支持PTP和MTP,但是Ubuntu 12.04显然仅支持PTP。这就是所使用的。由于新的Ubuntu版本具有对MTP的内置支持,因此现在可以使用它。

实际上,甚至可能以前以USB大容量存储设备访问了Walkman ,也就是USB硬盘和闪存驱动器使用的设备。也许出于某种原因,Linux(或您的Walkman)决定MTP比Mass Storage访问更可取。

您可以通过查看Walkman的URL来查看所使用的访问方法(在Nautilus中,转到Walkman文件夹,按Ctrl + L并查看地址栏):对于MTP,可以在例如下找到设备。mtp://[usb:001,004]/而对于PTP,它就像gphoto2://[usb:001,004]/store_00010001。对于大容量存储访问,URL只是一个普通路径,例如/media/WALKMAN

我不知道MTP是否比PTP或大容量存储有任何实际优势,或者是否可以切换回PTP或大容量存储。在Linux下,MTP和PTP实现都有自己的错误集,因此可能取决于您的用例哪个更好。AFAIK大容量存储是用户最理想的选择,但手机中的设备支持正在逐渐减少。


2
感谢您向我介绍gvfs-copy。但是,这非常麻烦,它不会递归复制目录。还有其他我可以递归执行的操作吗?
TuxForLife

1
gvfs-copy对于我来说,也不能比正常工作更好cp。以我为例,同一部电话过去可以通过MTP运作。有些电话可以使用,有些则不能使用。遍及MTP(当我在电话菜单中选择MTP连接选项时)。更新:发现问题。试图从卡复制到手机存储。我必须先复制到本地文件系统(例如/ tmp),然后再复制到手机存储。似乎mtp-> mtp直接复制不起作用(尚未)。
akostadinov '16

gvfs-copy或gvfs-moved都不适合我。使用Caja 1.8.2,我能够使用图形界面移动它们,然后删除文件。
Julien Lamarche

2

为了访问我的手机,我必须通过Linux Mint 17.1 Mate上的Synaptic软件包管理器安装mtp-server。我以前的Linux Mint 17 Mate不需要我安装mtp-server,通过usb端口连接时会自动识别我的手机。也许此信息会有所帮助。


您的意思是通过命令行吗?如我所说,我仍然可以通过GUI文件管理器访问它。
David Pitchford 2015年

Caja满足了我的需求,因此我无法在命令行方面为您提供帮助。
斯科特(Scott),

谢谢你斯科特。您的回答帮助我解决了以下错误消息:Kon 'mtp://[usb:003,029]/' niet weergeven. Fout: The name :1.1813 was not provided by any .service files Kies een andere weergavemethode en probeer het opnieuw.我的Adroid设备未通过Mint 17安装上的MTP连接。可能是在17.1升级之后。apt-get install mtp-server解决了我的问题。这是针对其他有此问题的搜索者,可能会对他们有所帮助,因为它对我有帮助。

2

我在以MTP模式连接的Ubuntu 16.04和Samsung Galaxy SIII上遇到了这个问题。

使用Oliver的建议使用gvfs-copy,直接从我的NAS复制到电话不起作用:(Nautilus也不行)。这是针对gvfs-copy中可能的错误的解决方案。

gvfs-copy '/run/user/1000/gvfs/smb-share:server=n2100,share=public/Music/The Story of Funk-1.mp2' '/run/user/1000/gvfs/mtp:host=%5Busb%3A001%2C005%5D/Card/Music/Radio/'
Error copying file /run/user/1000/gvfs/smb-share:server=n2100,share=public/Music/The Story of Funk-1.mp2: Operation unsupported

手册页建议的替代路径格式也没有:

gvfs-copy 'smb://n2100/public/Music/The Story of Funk-1.mp2' 'mtp://[usb:001,005]/Card/Music/Radio'
Error copying file smb://n2100/public/Music/The Story of Funk-1.mp2: Operation unsupported

但是先将文件复制到本地文件夹即可。{感谢akostadinov}(鹦鹉螺公司也是如此)。

gvfs-copy '/home/nigel/The Story of Funk-1.mp2' 'mtp://[usb:001,005]/Card/Music/Radio'

1

在Debian Jessie上,gvfs-copyfrom package gvfs-bin对我有用。

$ dpkg -S $(which gvfs-copy)
gvfs-bin: /usr/bin/gvfs-copy
$ dpkg -l gvfs-bin |tail -1
ii  gvfs-bin       1.22.2-1     amd64        userspace virtual filesystem - binaries

0

您可以尝试使用rsync同步到设备,尽管使用MTP传输通常不能为每个文件设置时间和日期戳。为了使传输更快,您应该对rsync使用--size-only选项,而不是-t选项。我发现将目录更改为mtp目录(例如/ run / user / 1000 / gvfs / mtp:host = blahblah / blah / blah)最简单,然后运行:

rsync -n -vlr --size-only --delete /source/of/files/ ./

-n选项用于执行空运行。如果您对结果满意,只需删除该选项即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.