Edited at

cpコマンドを使ったスクリプトを作るときに引っかかりそうなこと

More than 3 years have passed since last update.

覚え書きのようなもの。単純なことだけど、忘れないように。

違う!とか、こうすればいいじゃん!みたいなのはガンガンご指摘ください。

追加があったら随時更新するかも。


存在しないディレクトリ下にコピーはできない

何を当たり前のことを、と書いていて思いましたw


でもこんなケース。

例えばカレントディレクトリにあるhugaという空のディレクトリの下に、hogehogeというディレクトリを作ってその下にhuga.txtをコピーしようとする、例えば

cp -rf /hoge/huga.txt /huga/hogehoge/huga.txt

みたいなことをするとエラーになっちゃいます。

rオプション(aオプションも)でやってくれるのは、ディレクトリを再帰的にコピーするところで、何となく存在しないディレクトリがあるときはこのオプションが何とかしてくれるだろう、と思っていると失敗します(体験談)


わかりづらいですが、期待としては「コマンド実行時には存在しないhogehogeディレクトリを作成した上で、huga.txtをその中にコピーしてくれること」なのですが、そううまくは行かないということらしいです。

うまいことやる方法はないもんですかねえ。


ディレクトリごとコピー時に、コピー先を同名ディレクトリにすると、コピー先の有無によって結果が変わる

これもアレっと思ったポイントでした。


例えばカレントディレクトリにあるhogeというディレクトリをコピーするときにhuga/hogeとコピー先指定した場合(hugaディレクトリは既に作成済みとする)

cp -r hoge huga/hoge

huga/hogeというディレクトリが既に存在するか否かで結果が変わります。


  • huga/hogeが既に存在する場合

    huga/hogeの下にコピー元のhogeディレクトリがコピーされる。

    つまり、huga/hoge/hogeとなる。


  • huga/hogeがまだ存在しない場合

    hugaの下にコピー元のhogeディレクトリがコピーされる。

    つまり、huga/hogeとなる。


ファイルリストを読み込んで、それをコピーする簡単なスクリプトを作ったんですが、ファイルリストに書いてあるものがディレクトリだった場合、ここで引っかかります。


これを回避するために、コピー元がディレクトリか否かをチェックし、ディレクトリの場合はrsyncでコピーするようにしました。

そもそもrsyncでいいじゃん!という気はするんですけどね…。