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 件のコメント:
コメントを投稿