如何同步到安卓

gue*_*tli 62 android rsync

如何连接到我的 android 设备以同步音乐(或其他东西)?

Eva*_*oll 62

实际上在 MTP/usb 上使用 rsync

这比大家说的要容易,首先请注意,当 GVFS 挂载 MTP 挂载时,它将在下面可用。您可以通过在图形文件浏览器 (thunar/nautilus/etc) 中打开手机来强制执行此操作

/run/user/$UID/gvfs
Run Code Online (Sandbox Code Playgroud)

进去。假设您有一台 mtp 设备,这应该可以工作:

$ cd /run/user/$UID/gvfs/mtp*
Run Code Online (Sandbox Code Playgroud)

找到你想要传输文件的位置,然后将它们同步到它

$ cd SanDisk\ SD\ card/Movies/

$ pwd # prints "/run/user/1000/gvfs/mtp:host=%5Busb%3A003%2C096%5D/SanDisk SD card/Movies"

$ rsync --verbose --progress --omit-dir-times --no-perms --recursive --inplace ~/Videos/ ./
Run Code Online (Sandbox Code Playgroud)

同步选项

  • --inplace:我强烈建议使用--inplace没有哪个 mtp 可能想要将文件复制一个新的,然后将其重命名为旧的。这可能会导致将文件复制到 SD 卡两次:一次是为了 mtp 传输到 SD 卡,另一次是因为 MTP 驱动程序可能不支持 (mv),为了安全起见,它可能 (cp/rm) 在引擎盖下.
  • 阅读man rsync的的描述--verbose--progress--recursive但他们非常自我说明。
  • --omit-dir-times --no-perms 是必需的,因为 mtp 不支持。

  • 为什么是`--ignore-existing`?那只是失去了冗余。您始终可以使用 `--size-only` 来减少与目录列表的同步而不是校验和。我将添加 `--omit-dir-times` 和 `--no-perms`,因为这听起来很有用,而且我似乎记得在最后遇到了一个错误。 (4认同)
  • 我添加了以下选项`--omit-dir-times --no-perms --ignore-existing`。Rsync 无法通过 MTP 设置目录时间戳。我很确定“无权限”是默认设置,但我喜欢指定它。忽略现有文件允许它从停止的地方开始。 (3认同)
  • 我还使用将尾部斜杠放在目标上,这样我就不必在源上使用星号:`~/Videos/ ./` (3认同)
  • 我仍然收到“rsync:打开/run/user/1000/gvfs/...失败:不支持操作(95)”,无需 sudo 或“rsync:错误:无法统计目标/run/user/1000/gvfs/ ...使用 sudo 拒绝权限 (13)"。有小费吗? (2认同)

gue*_*tli 44

Using sshelper

I found this solution:

  • Install sshelper on the device (no rooted device needed, available from google play market)
  • In my WLAN the device is called "android". But you can use the IP, if you can't give the device a hostname.

Edit local ssh-config, to alter the default port for host "android"

.ssh/config
host android
    Port 2222
Run Code Online (Sandbox Code Playgroud)
  • Start sshelper on device.
  • 将安卓设备连接到您的 WLAN。

rsync -rvlc 音乐 android:SDCardLink/

更新 -rvlc-a喜欢因为设置权限和时间戳不起作用,所以你会收到很多警告。该选项-c使第二次同步更快。

-rvl --size-only-a喜欢因为设置权限和时间戳不起作用,所以你会收到很多警告。该选项--size-only使第二次同步更快。

不幸的是,音乐应用程序需要一些时间才能看到新文件。重新启动设备有帮助。

  • 无需修改 .ssh/config 即可将 rsync 与 SSHelper 一起使用的另一种方法:`rsync -avz -e 'ssh -p 2222' Music android:SDCardLink/` (http://stackoverflow.com/a/4630407/399105) (15认同)
  • @guettli 来自 rsync 人:-c,--checksum。如果没有此选项,rsync 使用“快速检查”(默认情况下)检查每个文件的大小和上次修改时间是否在发送方和接收方之间匹配。此选项更改此设置以比较具有匹配大小的每个文件的 128 位校验和。生成校验和意味着双方将花费大量磁盘 I/O 读取传输中的文件中的所有数据,因此这会显着减慢速度。 (5认同)
  • @guettli 我猜`--size-only` 将是最快的解决方案。然而,它并没有像`-c`那样保存 (4认同)
  • 我使用了 USB 网络共享并获得了更快的传输速度。在我运行 SSHelp 后,以下命令对我有用,它显示 IP `192.168.1.5`,每次都可能不同:`rsync -avzhP --inplace --info=progress2 -e 'ssh -p 2222' 192.168.1.5:/ storage/emulated/0/DCIM/Camera/ /home/username/path/to/pics/` (2认同)

小智 5

以上都没有达到我想要的效果。特别是OP问题的一部分:如何将rsync音乐传输到我的Android手机上?好吧,我从这些答案中汲取了部分建议,并编写了自己的 Bash 脚本:

#!/bin/bash

echo "Starting rsync with Android."

src_dir="/home/joshua/Music"
dst_dir="/run/user/$UID/gvfs/mtp:host=OnePlus_HD1925_SERIAL/Internal shared storage"
rsync --progress \
      --human-readable \
      --omit-dir-times \
      --no-perms \
      --recursive \
      --inplace \
      --size-only \
      --exclude='*.jpg' \
      --exclude='*.JPG' \
      --exclude='*.jpeg' \
      --exclude='*.JPEG' \
      --exclude='*.png' \
      --exclude='*.bmp' \
      --exclude='*.txt' \
      --exclude='*.pdf' \
      --delete \
      "$src_dir" "$dst_dir"

echo "rsync operation is done. Enjoy the music :)"
Run Code Online (Sandbox Code Playgroud)

我只是把它放在~/.local/bin我有其他脚本的地方(你的系统的默认值PATH实际上应该已经有这个目录)。您只需确保文件传输已打开并且存储在运行之前已实际安装。如果你不这样做,也不会发生什么不好的事情:rsync只会对你大喊大叫。

这个脚本:

  • 考虑到 Android 无法保留文件上的 ext4 样式元数据
  • 根据我的经验,使用确实比其他选项更快size-only
  • 排除专辑封面和扫描件淹没您手机的文件系统:)
  • 真的同步了!当您从源中删除时,它会删除一些内容,例如修复歌曲元数据并将其替换为正确的文件,而不是保留两个副本。

另外,如果您因为喜欢标签而专门选择此答案--exclude,那么如果手机已经同步了一大堆不需要的图像,您可能还需要一种方法来清理手机:

# Remove all *.jpg and *.JPG from the current directory, recursively.
find . -iname *.jpg -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)