我正在运行 Linux Mint 17.1 64 位(基于 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 时,它显示为路径/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 上进行文件操作,只是不能通过命令行。
答案1
猜测:您现在实际上正在使用 MTP 来访问您的 Walkman,而 MTP 很糟糕。
细节
该Operation not supported
错误可能表明您的 Walkman 使用不支持“直接”访问的 MTP 实现。根据http://intr.overt.org/blog/?p=174这种直接访问是 Android 特定的扩展,因此您的 Walkman 可能不支持它。
因此,您只能使用几种选定的方式来使用 MTP 访问 Walkman 上的文件:我想支持在单个操作中读取或写入文件的所有内容,而这些 MTP 实现不支持访问文件的选定部分。看来cp
Python 总是使用后一种访问方法,因此失败。
可能的解决方法
但是,您也许可以只替换cp
为gvfs-copy
.在我使用三星 Android 手机(其 MTP 实现也存在缺陷)的测试中,gvfs-copy
能够将文件复制到cp
失败的手机。
背景
我找不到太多关于这些设备相关的 MTP 限制的信息;以下是一些片段,其中对情况进行了一些解释:
https://askubuntu.com/a/284831 https://bugs.launchpad.net/ubuntu/+source/gvfs/+bug/1389001/comments/2 https://bugs.launchpad.net/ubuntu/+source/gvfs/+bug/1157583/comments/1
为什么之前有效?
至于为什么您的 Walkmancp
在 Mint 14 中可以使用,但在 Mint 17 中却不能使用,这可能是由于内部开关造成的点对点到MTP作为访问系统。至少这是我从 Ubuntu 12.04 切换到 14.04 时对三星设备注意到的情况。该手机同时支持PTP和MTP,但Ubuntu 12.04显然只支持PTP;这就是所使用的。由于新的 Ubuntu 版本内置了对 MTP 的支持,因此现在改用它。
实际上,甚至可能出现以下情况:您的 Walkman 之前曾被访问过USB 大容量存储设备,这是 USB 硬盘和闪存驱动器所使用的。也许出于某种原因,Linux(或您的随身听)认为 MTP 比海量存储访问更可取。
您可以通过查看 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 实现都有自己的一组错误,因此可能取决于您的用例,哪个更好。据我所知,大容量存储是用户最理想的选择,但手机中的设备支持正在减弱。
答案2
为了访问我的手机,我必须通过 Linux Mint 17.1 Mate 上的 Synaptic Package Manager 安装 mtp-server。我之前的 Linux Mint 17 Mate 不需要我安装 mtp-server,通过 USB 端口连接时会自动识别我的手机。也许这些信息会有所帮助。
答案3
我在 Ubuntu 16.04 和以 MTP 模式连接的 Samsung Galaxy SIII 上遇到了这个问题。
按照奥利弗的建议使用 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'
答案4
在 Debian Jessie 上,gvfs-copy
from packagegvfs-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