それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

お困り解決 cp コマンドでdir を作らずに、上書きコピー

cp コマンドって、ディレクトリが存在するときに、ディレクトリを上書きせずにその中に作っちゃう。エクスプローラーみたいな上書きコピーが出来ない。すっげー不便だと思ってた。

同名コピー先が存在する場合は、その中にコピーしたかったけど。。

takuya@air:~/Desktop$ mkdir  -p aaa/bbb
takuya@air:~/Desktop$ mkdir ccc
takuya@air:~/Desktop$ cp -r aaa ccc
takuya@air:~/Desktop$ tree ccc
ccc
└── aaa
    └── bbb
2 directories, 0 files

これが、cp コマンドの動作だと思ってた。 rsync なら、できるのに。
いままでは,

rsync -a aaa/ ccc

を使ってた。だってこれしかないと思うよね。

ところが出来た

cp -r aaa -T ddd

と-T を付けることで、ディレクトリの上書きコピーが出来るとわかった。

f:id:takuya_1st:20130526154009p:plain

https://twitter.com/takuya_1st/status/335796472085872640

実際やってみた

takuya@air:~/Desktop$ mkdir ddd
takuya@air:~/Desktop$ cp -r aaa -T ddd
takuya@air:~/Desktop$ tree ddd
ddd
└── bbb

1 directory, 0 files

うおををををおをできた!!

感動した。@m61k ありがとうございます。

このことによって、cp コマンドでディレクを作らずにファイル構造を維持して上書きコピーができるようになります。ディレクトリでディレクトリを上書きしして、コピーすることになります。bashワイルドカード展開に頼るという、bash設定に依っては完全にコピーされないファイルが出来る。
cp -r src/* dest にような不安定なコピーをしなくて済むのは本当に嬉しい。

追記 このことは man には載ってるけど載ってない

man cp して載ってない

ところが、 man cp に載ってる

       -T, --no-target-directory
              treat DEST as a normal file

どういうこと? export LANG=C すると見られる。日本語のman には載ってない。export LANG=ja_JPしていると見れないです。

これはcp のman なので coreutils のman の翻訳の採用が遅れてるということだろう。なのでこれからman をみるときは export LANG=C してからみるようにします。

こういう大事な変更がある場合、JPマニュアルも同じように更新しておいてほしい・・