LinuxでAndroidを接続して写真などを転送する方法

# LinuxでAndroidとデータ転送を行う

今回はLinuxでAndroidをUSB接続してデータ転送(差分バックアップ)を行います。

## 準備するもの
+ Andriod端末 (今回はXiaomi 13T Proを使用します)
+ Linuxマシン (今回はUbuntuを使用します)
+ USBケーブル


<details>

```bash:/etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```
<summary>
スペック
</summary>
</details>


## 接続方法

+ 1.USBでマシンと接続してください
+ 2.Android端末上で`ファイル転送 / Android Auto`を選択する

![androidscreenshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/564623a7-61d6-9d16-7ba0-0cebcb3f2e2a.jpeg)

+ 3.好きなアプリケーションで操作する
ここで、どこのディレクトリにマウントされているのか確認する必要があります。

`nautilus`でデバイスを認識しているはずです。そこから右クリックで`端末を開く`をすればそのディレクトリでTerminalを開くことが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/af314f8f-0dbf-14ea-31d5-41e91d07044b.png)

実際にターミナルでのpathは以下になりました。これは環境や端末によって変化します。あくまで一例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/ba20aea8-756b-8d68-2a2f-73e396d9a32a.png)

ファイルのパーミッションは自分の環境では以下の出力になりました。
```bash:ls -l
haruki-goto /run/user/1000/gvfs/mtp:host=Xiaomi_Xiaomi_13T_Pro_GMCAYLV46HCQIJ59/内部共有ストレージ[0] > ll
合計 0
drwx------ 1 haruki-goto haruki-goto 0  9月 22  2023 Alarms
drwx------ 1 haruki-goto haruki-goto 0  9月 22  2023 Android
drwx------ 1 haruki-goto haruki-goto 0  9月 22  2023 Audiobooks
drwx------ 1 haruki-goto haruki-goto 0  5月  1 22:26 DCIM
drwx------ 1 haruki-goto haruki-goto 0  6月 21 12:54 Documents
drwx------ 1 haruki-goto haruki-goto 0  6月 20 13:38 Download
drwx------ 1 haruki-goto haruki-goto 0  4月 13 20:39 MIUI
drwx------ 1 haruki-goto haruki-goto 0  6月  5 19:05 Movies
drwx------ 1 haruki-goto haruki-goto 0  4月 16 13:22 Music
drwx------ 1 haruki-goto haruki-goto 0  4月 14 12:59 Notifications
drwx------ 1 haruki-goto haruki-goto 0  6月 17 11:58 Pictures
drwx------ 1 haruki-goto haruki-goto 0  9月 22  2023 Recordings
drwx------ 1 haruki-goto haruki-goto 0  9月 22  2023 Ringtones
```

## 差分バックアップ
`rsync`を使って更新された分だけコピーします。

`--dry-run` オプションをつけることで、送信されるファイルが出力されるので差分バックアップになっているかまずはこのオプションで試すことをおすすめします。

```bash:Terminal
rsync -auv --progress DCIM/ ~/DCIM --dry-run
```
<details><summary>rsync --dry-runの出力</summary>

+ 以下で送信されるファイル一覧を取得できます。送信前に確認しておきましょう

```bash:Terminal
rsync --info=PROGRESS2 -au ./DCIM/ /mnt/E2A4D31BA4D2F0D1/DCIM --dry-run -v   
sending incremental file list
./
Camera/.trashed-1721362612-IMG_20240619_131637.jpg
Camera/.trashed-1721363506-IMG_20240619_133051.jpg
Camera/.trashed-1721363510-IMG_20240619_130521.jpg
Camera/.trashed-1721364044-IMG_20240619_134038.jpg
Camera/.trashed-1721450514-IMG_20240620_133943.jpg
Camera/.trashed-1721450525-IMG_20240620_134159.jpg
Camera/IMG_20240617_131432.jpg
Camera/IMG_20240617_131438.jpg
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Screenshots/Screenshot_2024-06-21-09-14-21-831_com.google.android.gm.jpg
Screenshots/Screenshot_2024-06-21-17-14-33-141_com.android.settings.jpg
 23,645,443,205  33% 22021.54GB/s    0:00:00 (xfr#169, to-chk=0/2173)

sent 66,067 bytes  received 6,552 bytes  3,090.17 bytes/sec
total size is 70,365,426,119  speedup is 968,967.16 (DRY RUN)
```
</details>

+ 差分バックアップ

```bash
rsync --info=PROGRESS2 -au ./DCIM/ /DCIM
2,843,302,063   4%   10.17MB/s    1:48:06 xfr#132, to chk=(352/2173)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sent 1,090,678,523 bytes  received 3,080 bytes  15,254,288.15 bytes/sec
total size is 64,147,123,048  speedup is 58.81
```

`-v`オプションをつけるとファイルごとの詳細が確認できますが、全体の進捗を確認したい場合には`--info=PROGRESS2`オプションを追加して下さい。多少時間がかかっても正確に進捗がを出力してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/a77023c8-8b00-9fad-13e2-6cbbf3953690.png)

+ 転送を停止, 再開
停止は`Ctrl + C`で停止すればOKです。再開も同じコマンドを打つだけで差分バックアップなのですでに転送済みのファイルは転送されないので非常に便利です。

これで差分バックアップができました。
お疲れ様でした。

# トラブルシューティング
+ そもそも認識しているかを確認してください。
```diff_shell
haruki-goto ~[0] > lsusb                  
Bus 008 Device 002: ID 13fd:5912 Initio Corporation External
Bus 008 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 002: ID 13fd:5912 Initio Corporation External
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 006: ID 048d:5702 Integrated Technology Express, Inc. ITE Device
Bus 001 Device 007: ID 046d:08e5 Logitech, Inc. HD Pro Webcam C920
Bus 001 Device 005: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 004: ID 2357:0604 TP-Link TP-Link UB500 Adapter
Bus 001 Device 003: ID 0416:b23c Winbond Electronics Corp. PCMK TKL
Bus 001 Device 002: ID 056e:013b Elecom Co., Ltd ELECOM OpticalMouse
+ Bus 001 Device 009: ID 2717:ff40 Xiaomi Inc. Mi/Redmi series (MTP)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

+ デバイスで信頼するかどうかを尋ねられたら必ず信頼するを選択してください。
+ デバイスがロックされていると転送できない端末の場合はロックされないように注意してください。(Xiaomi 13T Proはロック中でもOKでした)

以上です。質問等あればコメントでお願いします。