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 を付けることで、ディレクトリの上書きコピーが出来るとわかった。
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マニュアルも同じように更新しておいてほしい・・