今回はファイルをネットワーク経由でコピーします。今回使用するのはrsyncです。rsyncはscpよりも高機能ですしセキュリティやメンテナンス問題もあり、できればrsyncを使うようにした方がよいでしょう。

今回もこれまでと同様にデスクトップ上にあるsampleディレクトリに必要なファイルを用意しておきます。前回と同様に転送元のコンピューターと転送先のコンピューターの2台を使います。2台も用意できない、という場合は仮想環境を利用して同じマシンで異なるIPアドレス間でファイル転送を行うこともできます。sampleディレクトリ内の構成は前回と同じです。

man rsync

 とりあえず最初にman rsyncとしてマニュアルでパラメーター等を確認しておきましょう。特にman rsyncとしなくても今はWeb上に日本語訳のマニュアルや解説がありますので、そちらを参考にしても構いません。なお、rsyncのマニュアルは長いので、ここでは最初のページのみ示しておきます。

man rsync

・macOS

・Linux (Ubuntu 24LTS)

ファイルをコピー

 それではファイルを他のマシンにコピーしてみましょう。コピー先は前回と同様Raspberry Piです。rsyncはファイルの同期ができますが、まずは単純コピーです。 まず、カレントディレクトリを~/Desktop/sampleにします。

cd ~/Desktop/sample

カレントディレクトリ内にある1.txtファイルをrsyncコマンドでRaspberry Piの/home/pi/Desktop/sample/にコピー(転送)します。
以下のようにコマンドを入力します。コピー先のRaspberry Piのパスワードを尋ねてくるので入力します。入力後ファイルがコピーされます。

rsync 1.txt pi@192.168.11.52:/home/pi/Desktop/sample/

scpコマンドと違って何もオプションを指定しないと進捗状況などは表示されません。進捗状況などを表示する場合は-vを指定します。

rsync -v 1.txt pi@192.168.11.52:/home/pi/Desktop/sample/

1つのファイルだけでなく拡張子がtxtのファイルをまとめてコピーすることもできます。以下のようにするとカレントディレクトリにある拡張子がtxtのファイルがコピーされます。

rsync -v *.txt pi@192.168.11.52:/home/pi/Desktop/sample/

ディレクトリごとコピー

 次にsampleディレクトリ内にあるファイルとディレクトリをRaspberry Piにコピーします。この場合、以下のように指定します。scp、cpコマンドだとディレクトリのコピー指定はrですが、rsyncではaなので注意してください。

rsync -av . pi@192.168.11.52:/home/pi/Desktop/sample/

以下のように直接パスを指定してコピーすることもできます。

rsync -av /Users/weed/Desktop/sample/ pi@192.168.11.52:/home/pi/Desktop/sample/

ここで注意しないといけないのはコピー元のパスを指定する際に末尾に/を付けるか付けないかで結果が変わります。以下のように/がないとディレクトリ内でなくディレクトリも含めてコピーされます。

rsync -av /Users/weed/Desktop/sample pi@192.168.11.52:/home/pi/Desktop/sample/

/を付ける、付けないでコピーされる内容が変わると言われても、という場合は以下のようにオプションのnを付けるとコピーされるディレクトリ/ファイル内容を確認できます。表示内容はコピーされたことになっていますが、実際にはコピーされていません。

rsync -avn /Users/weed/Desktop/sample pi@192.168.11.52:/home/pi/Desktop/sample/

ファイルの同期

 次にrsyncでファイルの同期を行ってみます。scpでは単純コピーですが、rsyncでは差分のみ、新しいファイルだけコピー、完全同期などの処理を行うことができます。
 まず、差分コピーを試してみます。すでにRaspberry Piのデスクトップのsampleディレクトリ内にディレクトリやファイルがある場合はすべて削除しておいてください。
 以下のコマンドでRaspberry Piにディレクトリ/ファイルを転送します。

rsync -av /Users/weed/Desktop/sample/ pi@192.168.11.52:/home/pi/Desktop/sample/

ここで、Raspberry Piのデスクトップのsampleディレクトリ何にある1.txtと3.txtファイルを削除します。

ここで以下のコマンドを入力します。これは、これまでと同じですが、差分のみが転送されます。

rsync -av /Users/weed/Desktop/sample/ pi@192.168.11.52:/home/pi/Desktop/sample/

scpコマンドと違い差分のみコピーされるため状況によってはrsyncの方が速い場合があります。
上記コマンドの場合、転送元のファイルなどを削除しても転送先のファイルは削除されません。
実際にやってみましょう。転送元のsampleディレクトリ内にある1.txt,3.txtファイルを削除またはsampleディレクトリ外に移動させます。
移動させたら先ほどと同じコマンドを入力します。

rsync -av /Users/weed/Desktop/sample/ pi@192.168.11.52:/home/pi/Desktop/sample/

コマンドを実行しても転送先の1.txt,3.txtは削除されません。
ただ、転送元と転送先の内容を完全に一致させたい場合もあります。このような場合は以下のように--deleteを指定します。転送元にないファイルは削除されるので使用にあたっては注意してください。
以下のコマンドを入力すると転送先のsampleディレクトリ内のファイルが転送元と完全に一致するようになります。つまり1.txt,3.txtファイルが転送先から削除されます。

rsync -av --delete /Users/weed/Desktop/sample/ pi@192.168.11.52:/home/pi/Desktop/sample/

転送先と転送元のファイルを比較するには以下のようにcのオプションを追加します。ファイルは転送されず差分のみリストアップされます。sampleディレクトリ内のファイルを移動させたり名前を変更してから実行してみてください。

rsync -avcn /Users/weed/Desktop/sample/ pi@192.168.11.52:/home/pi/Desktop/sample/

rsyncには他にも便利な機能があります。いろいろオプションを指定して試してみるとよいでしょう。
scp,rsyncそれぞれ便利な面があるので、うまく使い分けるのがよいのかもしれません。 それでは、また次回。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。