RSync From Android

Every once in a while, I like to transfer a folder from my Android phone to my Mac. This folder has new content added every once in a while, and the files get large, so I don't want to re-transfer the already-sent files. Rsync is a perfect tool for this. After starting an SSH server with the SSHelper app, I use the following script to rsync the files over.

#!/bin/bash

remote_user='admin'
remote_host='192.168.1.66' # This isn't a static IP, so this might change once in a while. Check SSHelper output
remote_dir='/path/to/folder/on/phone'

local_dir='/path/to/folder/on/mac'

# exit on errors or unset variables
set -eu

# print commands before executing them
set -x

# these are the options I'm always going to use
# unfortunately, Bash won't really let me put any comments by the options
rsync_minimal() {
rsync \
    -e 'ssh -p 2222' \
    --recursive \
    --verbose \
    --compress \
    --human-readable \
    --stats \
    --progress \
    "$@"
}

# use this to go as fast as possible
rsync_minimal "${remote_user}@${remote_host}:${remote_dir}/" "${local_dir}/"

# use this if I need to not clog up our wi-fi
# rsync_minimal --bwlimit=500 "${remote_user}@${remote_host}:${remote_dir}/" "${local_dir}/"

Bonus

When messing with a filling filesystem on Android, I like to use the following command to see the biggest 30 files:

du -ax ./* | sort -k1,1n | tail -n30

Notes from man rsync

# Notes From `man rsync`
# ---
## rsync slashes on folder names

#   rsync -avz foo:src/bar/ /data/tmp

# A  trailing slash on the source changes this behavior to avoid creating an additional
# directory level at the destination.  You can think of a trailing /  on  a  source  as
# meaning  "copy  the  contents of this directory" as opposed to "copy the directory by
# name", but in both cases the attributes of the containing directory  are  transferred
# to  the containing directory on the destination.  In other words, each of the follow-
# ing commands copies the files in  the  same  way,  including  their  setting  of  the
# attributes of /dest/foo:

#   rsync -av /src/foo /dest
#   rsync -av /src/foo/ /dest/foo

## rsync --archive notes:

#         -a, --archive               archive mode; same as -rlptgoD (no -H)
#         -r, --recursive             recurse into directories
#         -l, --links                 copy symlinks as symlinks
#         -p, --perms                 preserve permissions
#         -t, --times                 preserve times
#         -g, --group                 preserve group
#         -o, --owner                 preserve owner (super-user only)
#         -D                          same as --devices --specials
#         --devices
#               This  option  causes rsync to transfer character and block device files to the
#               remote system to recreate these devices.  This option has  no  effect  if  the
#               receiving rsync is not run as the super-user and --super is not specified.


#         --specials
#               This  option  causes rsync to transfer special files such as named sockets and
#               fifos.

# ---

Rclone

I don't want to make a new blog post for this, but here's a good way to use rclone to copy files. Also see the docs.

rclone \
    --dry-run \
    --progress \
    --log-level DEBUG \
    --log-file ~/tmp_rclone.log.json \
    --use-json-log \
    copy \
    ~/tmp bbkane_onedrive:/tmp