web-dev-qa-db-ja.com

シンボリックリンクを使用して宛先階層にcpしますか?

次のようなファイルをコピーするサイト展開スクリプトを作成しようとしています。

[〜#〜]ソース[〜#〜]

.
..
src/
html/

[〜#〜]宛先[〜#〜]

.
..
src/
html/ -> /var/www/ftproot/mysite

SOURCE htmlのファイルをDEST/var/www/ftproot/mysiteに移動させたい。

スクリプトは次のとおりです。

cd SOURCE
cp -Rf * DEST

スクリプトを実行するたびに、次のエラーが発生します。

cp: cannot overwrite non-directory 'html' with directory `html'

このことから、DESTにシンボリックリンクがある場合、cpはファイルをDESTに自動的にコピーできないと推測します。

ノート:

  1. cpマニュアル に続いて、POSIXLY_CORRECTを1に設定しました。これは機能しません。

  2. サイトhtmlftproot/mysiteにリンクする必要がありましたが、その逆はありませんでした。これは、ftpユーザーのアクセスモードがおかしいためです。

  3. この男 変更cpソースコードとそれを再コンパイルしました。実稼働サーバーにはそれをしたくありません。

これを解決する方法についてのアイデアはありますか?

4
est

ファイルをコピーする場合は、rsyncよりもcpをお勧めします。これは、コピーする対象と方法をより細かく制御できるためです。あなたの場合、コマンドを与えるだけです:

cd SOURCE
rsync -K -a . DEST

-Kオプションは、必要な処理を正確に実行します。-K、-keep-dirlinksは、レシーバーのシンボリックリンクされたdirをdirとして扱います。

5
sparkie

CpはDESTのシンボリックリンクを介してSOURCEのディレクトリをコピーしないため、1つのオプションは、シンボリックリンクごとに個別にそれらのディレクトリをコピーすることです。

find を使用したアプローチ

cd DEST
cp -Rf SOURCE/* .
find -type l -exec bash -c 'cp -Rf "SOURCE/$0"/* "$0"' {} \;

詳細

  • -type lは検索をシンボリックリンクに制限します。
  • -exec bash -c '...' {} \;は、見つかったすべてのシンボリックリンクに対してbashサブシェルで...を実行し、{}(シンボリックリンクへの相対パス)を最も適切な引数($0)として渡します。
  • cp -Rf "SOURCE/$0"/* "$0"は、対応するソースディレクトリの内容をシンボリックリンクが指すディレクトリにコピーします。
  • Cpコマンドはbashを使用して呼び出す必要があるため、glob(アスタリスク)が展開されます。

注意事項

  • cpechoに(または-Rf-Riに)置き換えて、findが期待どおりに動作することを確認することをお勧めします。
  • DESTに存在する正確なディレクトリ構造とシンボリックリンクを知らなければ、考えられるすべての奇妙なことを予測したことを保証することはできません。
2
Dennis