8
7

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コマンドを使ったスクリプトを作るときに引っかかりそうなこと

Last updated at Posted at 2014-12-25

覚え書きのようなもの。単純なことだけど、忘れないように。
違う!とか、こうすればいいじゃん!みたいなのはガンガンご指摘ください。
追加があったら随時更新するかも。

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

何を当たり前のことを、と書いていて思いました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でいいじゃん!という気はするんですけどね…。

8
7
0

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
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?