次のようなファイルをコピーするサイト展開スクリプトを作成しようとしています。
[〜#〜]ソース[〜#〜]
.
..
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に自動的にコピーできないと推測します。
ノート:
cpマニュアル に続いて、POSIXLY_CORRECT
を1に設定しました。これは機能しません。
サイトhtml
をftproot/mysite
にリンクする必要がありましたが、その逆はありませんでした。これは、ftpユーザーのアクセスモードがおかしいためです。
この男 変更cp
ソースコードとそれを再コンパイルしました。実稼働サーバーにはそれをしたくありません。
これを解決する方法についてのアイデアはありますか?
ファイルをコピーする場合は、rsync
よりもcp
をお勧めします。これは、コピーする対象と方法をより細かく制御できるためです。あなたの場合、コマンドを与えるだけです:
cd SOURCE
rsync -K -a . DEST
-Kオプションは、必要な処理を正確に実行します。-K、-keep-dirlinksは、レシーバーのシンボリックリンクされたdirをdirとして扱います。
CpはDESTのシンボリックリンクを介してSOURCEのディレクトリをコピーしないため、1つのオプションは、シンボリックリンクごとに個別にそれらのディレクトリをコピーすることです。
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
をecho
に(または-Rf
を-Ri
に)置き換えて、findが期待どおりに動作することを確認することをお勧めします。