cp --parentsでパスごとコピーする

デプロイ用のファイルとかをコピーしてるとパス付きでまるっとコピーしたくなることがあると思うんだけど、そういう時は--parentsを使うとよい。


状況としてはこんな感じ。

$ tree hoge
hoge
└── fuga
    ├── bar.txt
    ├── foo.txt
    └── piyo.txt       ←これだけコピーしたい

1 directory, 3 files

piyo.txtが更新されたのでこのファイルだけデプロイ対象として持っていきたい。
hoge以下全部持っていくのならcp -R hoge rel-20110628とかでまるっとコピーすればいいけど、foo.txtとbar.txtは巻き込みたくない。


普通にコピーすると……

$ cp -v hoge/fuga/piyo.txt rel-20110628
`hoge/fuga/piyo.txt' -> `rel-20110628/piyo.txt'
$ tree rel-20110628
rel-20110628
└── piyo.txt

0 directories, 1 file

こんな感じでpiyo.txtがrel-20110628にコピーされる。ですよねー。
まぁ当たり前といえば当たり前。


で、--parentsを付けると

$ cp --parents -v hoge/fuga/piyo.txt rel-20110628
hoge -> rel-20110628/hoge
hoge/fuga -> rel-20110628/hoge/fuga
`hoge/fuga/piyo.txt' -> `rel-20110628/hoge/fuga/piyo.txt'
$ tree rel-20110628
rel-20110628
└── hoge
    └── fuga
        └── piyo.txt

2 directories, 1 file

こうなる。コピー元のパスがそのままコピーされる。

GNU coreutils

ちなみにこのオプションはBSD系にはないので、GNU coreutilsとか入れればいいと思うよ!