LoginSignup
19
15

More than 5 years have passed since last update.

cp でコピー先ディレクトリのあり/なし

Posted at

/tmp/aaa/ が次のようにあったとします。

$ tree /tmp/aaa/
/tmp/aaa/
`-- xxx

0 directories, 1 file

次のコマンドで、

$ cp -a /tmp/aaa/ /tmp/zzz/

/tmp/zzz/ はどうなるでしょうか?

$ tree /tmp/zzz/

もし /tmp/zzz/ が存在しなければ次のようになります。

$ tree /tmp/zzz/
/tmp/zzz/
`-- xxx

0 directories, 1 file

もし /tmp/zzz/ が存在すれば次のようになります。

$ tree /tmp/zzz/
/tmp/zzz/
`-- aaa
    `-- xxx

1 directory, 1 file

なので同じコマンドを2回実行するとこんなことになります。

$ rm -fr /tmp/zzz/
$ cp -a /tmp/aaa/ /tmp/zzz/
$ cp -a /tmp/aaa/ /tmp/zzz/
$ tree /tmp/zzz/
/tmp/zzz/
|-- aaa
|   `-- xxx
`-- xxx

1 directory, 2 files

個人的にはこの動作が非常に判りにくく感じるので、ローカルでコピーするときも rsync を使うことが多いです。

rsync なら ディレクトリ末尾に / を付けさえすれば コピー先にディレクトリがあろうとなかろうと結果は同じだからです。

$ rm -fr /tmp/zzz/
$ rsync -a /tmp/aaa/ /tmp/zzz/
$ tree /tmp/zzz/
/tmp/zzz/
`-- xxx

0 directories, 1 file
$ rm /tmp/zzz/xxx
$ rsync -a /tmp/aaa/ /tmp/zzz/
$ tree /tmp/zzz/
/tmp/zzz/
`-- xxx

0 directories, 1 file

あるいは cp でもコピー元ディレクトリの末尾に /. を付けると似たような動作になります。

$ rm -fr /tmp/zzz/
$ cp -a /tmp/aaa/. /tmp/zzz/
$ tree /tmp/zzz/
/tmp/zzz/
`-- xxx

0 directories, 1 file
$ rm /tmp/zzz/xxx
$ cp -a /tmp/aaa/. /tmp/zzz/
$ tree /tmp/zzz/
/tmp/zzz/
`-- xxx

0 directories, 1 file

さらにコピー先ディレクトリの末尾に /. を付けると、コピー先ディレクトリがなければ失敗します(意図しない形でコピーされるよりは失敗した方がマシ)。

$ rm -fr /tmp/zzz/
$ cp -a /tmp/aaa/. /tmp/zzz/.
cp: cannot create directory `/tmp/zzz/.': No such file or directory
$ mkdir /tmp/zzz/
$ cp -a /tmp/aaa/. /tmp/zzz/.
$ tree /tmp/zzz/
/tmp/zzz/
`-- xxx

0 directories, 1 file
19
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
15