20
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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
20
16
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
20
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?