cpioで単純なディレクトリコピー

今回はcpioでディレクトリをコピーを行います。

コピー元のディレクトリはこれです。

takk@deb9:~/tmp$ ls
dir1
takk@deb9:~/tmp$ ls -l dir1
合計 32
-rw-r--r-- 1 takk takk 8  5月  6 20:08 x00
-rw-r--r-- 1 takk takk 8  5月  6 20:08 x01
-rw-r--r-- 1 takk takk 8  5月  6 20:08 x02
-rw-r--r-- 1 takk takk 8  5月  6 20:08 x03
-rw-r--r-- 1 takk takk 8  5月  6 20:08 x04
-rw-r--r-- 1 takk takk 8  5月  6 20:08 x05
-rw-r--r-- 1 takk takk 8  5月  6 20:08 x06
-rw-r--r-- 1 takk takk 8  5月  6 20:08 x07
takk@deb9:~/tmp$ 

cpioの前に、cpによるディレクトリコピー。
cpでコピーするには、-rオプションを指定してコピー元、コピー先を指定するだけなので簡単ですね。

takk@deb9:~/tmp$ cp -r dir1 dir2
takk@deb9:~/tmp$ ls
dir1  dir2
takk@deb9:~/tmp$ ls -l dir2
合計 32
-rw-r--r-- 1 takk takk 8  5月  6 20:23 x00
-rw-r--r-- 1 takk takk 8  5月  6 20:23 x01
-rw-r--r-- 1 takk takk 8  5月  6 20:23 x02
-rw-r--r-- 1 takk takk 8  5月  6 20:23 x03
-rw-r--r-- 1 takk takk 8  5月  6 20:23 x04
-rw-r--r-- 1 takk takk 8  5月  6 20:23 x05
-rw-r--r-- 1 takk takk 8  5月  6 20:23 x06
-rw-r--r-- 1 takk takk 8  5月  6 20:23 x07
takk@deb9:~/tmp$ 

ではcpioでコピーしましょう。-pオプションを指定します。
cpioに標準入力でファイルリストを与えて、引数にコピー先ディレクトリを指定します。

takk@deb9:~/tmp$ ls
dir1
takk@deb9:~/tmp$ find dir1 | cpio -p dir2
cpio: dir2/dir1: Cannot mkdir: そのようなファイルやディレクトリはありません
cpio: dir2/dir1/x02: Cannot open: そのようなファイルやディレクトリはありません
cpio: dir2/dir1/x05: Cannot open: そのようなファイルやディレクトリはありません
cpio: dir2/dir1/x03: Cannot open: そのようなファイルやディレクトリはありません
cpio: dir2/dir1/x01: Cannot open: そのようなファイルやディレクトリはありません
cpio: dir2/dir1/x07: Cannot open: そのようなファイルやディレクトリはありません
cpio: dir2/dir1/x00: Cannot open: そのようなファイルやディレクトリはありません
cpio: dir2/dir1/x06: Cannot open: そのようなファイルやディレクトリはありません
cpio: dir2/dir1/x04: Cannot open: そのようなファイルやディレクトリはありません
0 blocks
takk@deb9:~/tmp$ 

だめでした。
コピー先のディレクトリが存在しないため、エラーになりました。

予めディレクトリを作成しておくか、cpio -pオプションに-dオプションも併用する必要があります。

takk@deb9:~/tmp$ ls
dir1
takk@deb9:~/tmp$ mkdir dir2
takk@deb9:~/tmp$ find dir1 | cpio -p dir2
1 block
takk@deb9:~/tmp$

これでコピーできたはずですが、どうでしょうか。
コピー先を確認します。

takk@deb9:~/tmp$ ls -l dir2
合計 4
drwxr-xr-x 2 takk takk 4096  5月  6 20:43 dir1
takk@deb9:~/tmp$ find dir2
dir2
dir2/dir1
dir2/dir1/x02
dir2/dir1/x05
dir2/dir1/x03
dir2/dir1/x01
dir2/dir1/x07
dir2/dir1/x00
dir2/dir1/x06
dir2/dir1/x04
takk@deb9:~/tmp$ 

なぜかdir2の下にdir1がごっそりまるごとコピーされています。
dir1の配下がすべて、dir2下に格納されてほしいのに。

いったんdir1の中にカレントディレクトリを切り替えてから、コピーする必要がありそうです。

takk@deb9:~/tmp$ ls
dir1
takk@deb9:~/tmp$ (cd dir1;find | cpio -pd ../dir2)
1 block
takk@deb9:~/tmp$ ls
dir1  dir2
takk@deb9:~/tmp$ ls -l dir2
合計 32
-rw-r--r-- 1 takk takk 8  5月  6 21:00 x00
-rw-r--r-- 1 takk takk 8  5月  6 21:00 x01
-rw-r--r-- 1 takk takk 8  5月  6 21:00 x02
-rw-r--r-- 1 takk takk 8  5月  6 21:00 x03
-rw-r--r-- 1 takk takk 8  5月  6 21:00 x04
-rw-r--r-- 1 takk takk 8  5月  6 21:00 x05
-rw-r--r-- 1 takk takk 8  5月  6 21:00 x06
-rw-r--r-- 1 takk takk 8  5月  6 21:00 x07
takk@deb9:~/tmp$ 

今度はうまくいきましたが、ものすごくめんどくさいです。
普通にcp -r使った方がよいですね。

Leave a Reply

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

CAPTCHA