rsyncは、リモートファイルとのファイル同期を行うコマンドですが、単純なコピーもできます。
今回は、cpによるディレクトリコピーと、rsyncによるディレクトリコピーの違いを見ていきます。
~$ mkdir test;cd test ~/test$ mkdir src ~/test$ mkdir src ~/test$ cd src ~/test/src$ seq 30 | perl -ne 'print chr' | split -db10 ~/test/src$ cd .. ~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ~/test$
コピー元ファイルの準備ができました。
まずは、オプションを付けずに、引数に元ディレクトリ、先ディレクトリを指定して実行します。
~/test$ cp src dest cp: ディレクトリ `src' を省略しています . ./src ./src/x02 ./src/x00 ./src/x01 ~/test$
この指定方法では当然コピーできませんでした。rsyncでもこの指定方法ではコピーできません。
~/test$ rsync src dest skipping directory src ~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ~/test$
以下の指定方法では得に何も起こりません。
~/test$ cp src dest ~/test$ cp src/ dest ~/test$ cp src/ dest/ ~/test$ rsync src dest ~/test$ rsync src/ dest
rsyncでは、以下の指定方法で、空のディレクトリが作成されます。
~/test$ rsync src dest/ skipping directory src ~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ./dest ~/test$
さて次は、リカーシブオプション-rをつけます。
cpコマンドからです。
~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ~/test$ cp -r src dest ~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ./dest ./dest/x02 ./dest/x00 ./dest/x01 ~/test$
cp -r src destではsrcディレクトリがまるごとdestという名前でコピーされました。
rsyncで同じ指定をするとどうなるでしょうか。
~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ./dest ./dest/x02 ./dest/x00 ./dest/x01 ~/test$ rm -rf dest ~/test$ rsync -r src dest ~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ./dest ./dest/src ./dest/src/x02 ./dest/src/x00 ./dest/src/x01 ~/test$
cpと同じように指定してしまうと、destというディレクトリができて、その中でsrcがまるごとコピーされます。
rsyncの結果をcpの結果と同じようにするには、
~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ~/test$ rsync -r src/ dest ~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ./dest ./dest/x02 ./dest/x00 ./dest/x01 ~/test$
これでsrcディレクトリがdestという名前でコピーされました。
次は、destディレクトリが存在する場合のコピーです。
~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ./dest ./dest/x02 ./dest/x00 ./dest/x01 ~/test$ cp -rf src dest ~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ./dest ./dest/x02 ./dest/x00 ./dest/src ./dest/src/x02 ./dest/src/x00 ./dest/src/x01 ./dest/x01 ~/test$
すでにdestディレクトリが存在するため、cpコマンドでは、destディレクトリの下にsrcがまるごとコピーされてしまいます。
cp -rf src/ destも同様です。
destディレクトリが存在する場合の、rsyncによるコピーはどうなるでしょうか
~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ./dest ./dest/x02 ./dest/x00 ./dest/x01 ~/test$ rsync -r src/ dest ~/test$ find . ./src ./src/x02 ./src/x00 ./src/x01 ./dest ./dest/x02 ./dest/x00 ./dest/x01 ~/test$
ディレクトリは同じになりました。
まとめると、
destディレクトリがない場合のコピーは、
cp -r src dest
cp -r src/ dest
rsync -r src/ dest
destディレクトリがある場合のコピーは、
rsync -r src/ dest
のみとなります。
コメント
[…] ← ディレクトリコピー(cpとrsync) […]