ディレクトリコピー(cpとrsync)

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
のみとなります。

One response to “ディレクトリコピー(cpとrsync)

  1. Pingback: rsyncでローカルファイルの更新 | コマンドの達人

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA