Heavy Watal

rsync

ファイルをコピーし、2つのディレクトリを同期する。 更新があったものだけをコピーする、 ひとつのsshセッションで複数のファイルを送受信する、 という使い方が可能なので cpscp よりも便利な場合が多い。

基本

オプションについては後述するとして、基本は:

rsync -auv SRC/ DST/

SRC側の末尾のスラッシュの有無によって結果が大きく異なることに注意。 DST側は付けても付けなくても同じ。

## SRC/ 以下のファイルが DST/ 以下に入る
rsync -auv SRC/ DST

## ディレクトリ DST/SRC が作られる
rsync -auv SRC DST

## 結果は同じだが、下のほうがより明示的
rsync -auv SRC/DIR DST
rsync -auv SRC/DIR/ DST/DIR/

sshの設定をしておけばリモートホストへの転送も可能。 その場合は宛先を remote_machine:~/DST のようにコロンで指定する。

Options

-a, --archive
バックアップ用途のオプション一式 -rlptgoD
-u, --update
受け手の方が新しいファイルをスキップ
-v, --verbose
冗長なメッセージ表示
-n, --dry-run
実際に送受信を行わず試してみる
-z, --compress
圧縮・展開のCPUコストはかかるけど通信量は減る
--delete
SRC側に存在しないものがDST側にあったとき削除
--delete-excluded
除外設定されているファイルが受け手側にあったら削除(危険!)
--ignore-existing
受信側に存在していたら無視
--iconv
文字コードを変換する。 異なるOS/FS間でウムラウトや日本語を含むファイルを送受信するときに使う。 リモート側だけ指定すれば十分だけどローカルも明示的に指定できる。 その場合、pushかpullかによらず ={LOCAL},{REMOTE} の順番で。 例えばローカルのLinuxマシンとリモートの古いMacでやり取りする場合は --iconv=utf8-mac or --iconv=utf8,utf8-mac 。 新しいMacのAPFSはLinuxと同じ utf8 と見なしておけば良さそう…?

Exclude and include

https://download.samba.org/pub/rsync/rsync.1#PATTERN_MATCHING_RULES

--include=<PATTERN>
マッチするファイル・ディレクトリを除外しない
--exclude=<PATTERN>
マッチするファイル・ディレクトリを除外
--exclude-from=<FILE>
ファイルに記述した除外パターンを読む
-C, --cvs-exclude
ほぼいつでも無視したいであろうものを除外する。 基本的にはこれを使う方針で大丈夫そうだが tags, core とかはディレクトリ名として普通に使いそうなので注意。
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/ .git/ .hg/ .bzr/
これに加えて ${HOME}/.cvsignore も自動で読まれるというのが便利。

SSH越しの送受信

rsync -auv user@example.com:~/dir/ ~/dir/

wget

https://www.gnu.org/software/wget/manual/wget.html

-nv, --no-verbose
基本が結構うるさいverboseなので、最低限の表示に抑える。 -q, --quiet よりはマイルド。
-P, --directory-prefix
出力先のディレクトリ。デフォルトは . カレント。
-O
単一の出力ファイルを指定。 シェルの > リダイレクトと同じように、既存のファイルはまず消される。 ハイフン - で標準出力。
何もつけなければURLの最後の部分がファイル名になる。 これを繰り返すと file.1 のように連番が付く。
-nc, --no-clobber
出力先ファイルが存在する場合、サイズや時間によらず連番も取得もしない。 使い所がわからない。
-c, --continue
出力先ファイルが存在する場合、連番をつけずに部分ファイルとして扱う。 不足分だけ取得して通信量を節約できるとは限らない。
-N, --timestamping
ローカルのファイルが新しい場合は取得しない。 時間だけでなくサイズの違いも考慮してくれる。

Recursive retrieval options

これの存在が curl との大きな違い。

-m, --mirror
-r -N -l inf --no-remove-listing
-r, --recursive
再起的に取得。 ftpでは普通にディレクトリを潜っていく。
http(s)ではリンクを辿ることを意味する。 一見ディレクトリ指定のような https://example.com/dir/ を渡した場合でも、 --default-page (index.html) ファイルを取得してそのリンクを辿る。
-l, --level
再帰の最大深度を指定。0で無制限。デフォルトは5。
-A, --accept, -R, --reject, --accept-regex, --reject-regex
指定したsuffixあるいはパターンにマッチするものだけを取得、あるいは除外。 comma-separated list。
ディレクトリ版は -I, --include-directories, X, --exclude-directories
-H, --span-hosts
外部ホストへのリンクも辿る。
-L, --relative
相対リンクのみ辿る。
-np, --no-parent
ディレクトリを遡らない。 -r を使うときは大概この挙動を意図してるはず。
URL末尾のスラッシュ / をちゃんとつけないとそのディレクトリが起点にならないので注意。
-nH, --no-host-directories
ホスト名のディレクトリを作らない。 デフォルトでは example.com/file のようにホスト名のディレクトリが作られる。
逆に確実に作りたい場合は -x, --force-directories
--cut-dirs
取得元のディレクトリ階層を上から指定した数だけ無視して下層だけ作る。
option output
-r -np -P tmp tmp/example.com/dist/dir/file
-r -np example.com/dist/dir/file
-r -np -nH dist/dir/file
-r -np -nH --cut-dirs=1 dist/file
-r -nd file

curl

https://curl.se/

大概どのOSでも最初から入ってるので、 単一ファイルを取得するには手軽で便利。 インストールスクリプトなどで使われることも多い。

-f, --fail
403 Forbidden や 404 Not Found のときにそのページを取得せずエラー終了する。
-s, --silent
プログレスバーやエラーの表示を抑制する。
-S, --show-error を追加してエラー表示だけ有効にすることが多い。
-L, --location
3xxリダイレクトを辿る。
-o, --output
出力先ファイルを指定。 デフォルト無指定もしくはハイフン - で標準出力。
URLに {one,two}[1-3] のような表現を含めて複数ファイルを取得する場合は file#1.txt のようなプレースホルダが使える。
-O, --remote-name
URLの最後の部分をファイル名として保存。
サーバー側が指定した名前を採用したい場合は -J, --remote-header-name を使う。
-R, --remote-time
リモートファイルのタイムスタンプを取得してローカルファイルに適用。
--output-dir
出力先ディレクトリを指定。 デフォルトは . カレント。 存在しないディレクトリを作ってもらうには --create-dirs も必要。
--no-clobber
出力先ファイルが存在する場合、上書きせず連番をつける。