2009年5月27日水曜日

cp -pr aho とcp -pr aho/ の違い  ~  /のあるなしで大失敗

Unixを使い始めて十数年、今頃になってこんな失敗するか~、という失敗。



ファイルをコピーするcpコマンド。



「-p」オプションは、ファイルの属性も同じにしてコピーするもの。



「-r」オプションはサブディレクトリも含めて再帰的にコピーするもの・・・だとさっきまで思ってたんですが、FreeBSDでcp(1)のマニュアルを見たら、実装依存なので使うなと指摘されていて、FreeBSDの場合は、「-RL」と同じ挙動をする、とのこと。



というわけで、「-RL」について見てみる。



「-R」が再帰的にコピーするんだけどいろいろ細かな注釈がある・・・実はここ重要!!



「-L」はシンボリックリンクをたどる、とのこと。



どんな失敗をしたのか、以下に例をしめします。


/tmp/test以下に、こんなファイルがあります。



% ls -lRa /tmp/test
total 10
drwxrwxrwx   2 nhh   wheel   512  5 26 23:23 .
drwxrwxrwt  18 root  wheel  1536  5 26 23:22 ..
-rw-r--r--   1 nhh   nhh       4  5 26 23:22 file1
-rw-r--r--   1 nhh   nhh       7  5 26 23:22 file2
-rw-r--r--   1 nhh   nhh      10  5 26 23:23 file3



/tmp/testを、/home/nhh/dstへコピーしたいとします。



今の/home/nhh/dstはこんな感じ。



% ls -lRa /home/nhh/dst/
total 4
drwxr-xr-x  2 nhh  nhh  512  5 26 23:22 .
drwxr-xr-x  3 nhh  nhh  512  5 26 23:22 ..



コピーします。



% cp -pr /tmp/test /home/nhh/dst/



コピー先を見てみます。



% ls -lRa /home/nhh/dst/
total 6
drwxr-xr-x  3 nhh  nhh  512  5 26 23:25 .
drwxr-xr-x  3 nhh  nhh  512  5 26 23:22 ..
drwxrwxrwx  2 nhh  nhh  512  5 26 23:23 test



/home/nhh/dst/test:
total 10
drwxrwxrwx  2 nhh  nhh  512  5 26 23:23 .
drwxr-xr-x  3 nhh  nhh  512  5 26 23:25 ..
-rw-r--r--  1 nhh  nhh    4  5 26 23:22 file1
-rw-r--r--  1 nhh  nhh    7  5 26 23:22 file2
-rw-r--r--  1 nhh  nhh   10  5 26 23:23 file3



うまくいきました。これは意図したとおりの結果。



次の実験の前に、コピーしたファイルを消しておきますね。



% rm -rf /home/nhh/dst/test
% ls -lRa /home/nhh/dst/
total 4
drwxr-xr-x  2 nhh  nhh  512  5 26 23:28 .
drwxr-xr-x  3 nhh  nhh  512  5 26 23:22 ..



次の方法。コピー元のディレクトリ名のあとに「/」をつけて、コピーしてみました。



% cp -pr /tmp/test/ /home/nhh/dst/



コピー先を見てみます。



% ls -lRa /home/nhh/dst/
total 10
drwxrwxrwx  2 nhh  nhh  512  5 26 23:23 .
drwxr-xr-x  3 nhh  nhh  512  5 26 23:22 ..
-rw-r--r--  1 nhh  nhh    4  5 26 23:22 file1
-rw-r--r--  1 nhh  nhh    7  5 26 23:22 file2
-rw-r--r--  1 nhh  nhh   10  5 26 23:23 file3



今度は、コピー先に、testというディレクトリは作られず、コピー元のtestの中にあったファイルだけ、コピーされています。



この挙動については、マニュアルcp(1)に書かれているので、ああ、そうだったっけ、と思い出すのでありました。



失敗というのはそこではなくて・・・ちょっとわかりにくいんですけど、ディレクトリ/home/nhh/dstのモード(パーミッション)が、0755から、0777に変化してる、というところ。



cp -pr /tmp/test/ /home/nhh/dst/を実行する前。

drwxr-xr-x  2 nhh  nhh  512  5 26 23:28 .

実行した後。

drwxrwxrwx  2 nhh  nhh  512  5 26 23:23 .

これは、コピー元のディレクトリの/tmp/testのモードと同じになったんですね。



えー!?なんか納得いかないんすけど・・・



大失敗をしたときはですね、実は、コピー先が、ホームディレクトリだったんです。



% cp -pr /tmp/test/ /home/nhh/
% ls -la /home/nhh/
total 12
drwxrwxrwx   3 nhh   nhh     512  5 26 23:23 .
drwxr-xr-x  23 root  wheel  1024  2 22 16:11 ..
drwxrwxrwx   2 nhh   nhh     512  5 26 23:23 dst
-rw-r--r--   1 nhh   nhh       4  5 26 23:22 file1
-rw-r--r--   1 nhh   nhh       7  5 26 23:22 file2
-rw-r--r--   1 nhh   nhh      10  5 26 23:23 file3



ホームディレクトリのモードが0777になってたことに、しばらく気がつきませんでした。ひゃー!



0 件のコメント:

コメントを投稿