2014-04-01 66 views
0

每次我递归复制我总是以httpdocs文件夹而不是public_html中的文件结束。Linux复制递归

比如我可能会遇到这样的:

cp -rpf /var/www/vhosts/website/httpdocs /var/www/vhosts/anotherwebsite/httpdocs 

我总是在/ var/WWW /虚拟主机/ anotherwebsite/httpdocs资料/ httpdocs资料时,所有我试图做的是从一个用户移动网站结束到另一个。

+0

目标文件夹已经存在吗? – Thilo

+0

'cp -rpf/var/www/vhosts/website/httpdocs/var/www/vhosts/anotherwebsite /' – devnull

+0

是的,它总是存在的,因为我通常更新一个网站。 –

回答

0

当您只是想“推”您的本地网站而没有长时间离线时,您可以使用临时目录。

TODAY=$(date +%y%m%d) 
NEWCODE=/var/www/vhosts/anotherwebsite/docs_${TODAY} 
OLDCODE=/var/www/vhosts/anotherwebsite/docs_old 
rm -rf ${NEWCODE} 
cp -rpf /var/www/vhosts/website/httpdocs ${NEWCODE} || exit 1 
# some checks ? 
cd /var/www/vhosts/anotherwebsite/ || exit 1 
mv httpdocs ${OLDCODE} || exit 1 
mv ${NEWCODE} httpdocs 

之间的动作,你将无法使用。当这是一个问题时,您可能需要创建一个work_in_progress.html文件,将该文件重命名为httpdocs/index.html,删除所有其他文件并在此后复制新文件(正确的index.html文件作为最后一个文件) 。 但是,这似乎喜欢,坚持在上面的解决方案中短小的木桶。

+0

嘿,Walter,我不希望这样做,我通常会将整个网站复制到另一个域我们有和在那里工作(在同一台Linux服务器上),所以我只想复制文件。我总是以httpdocs/httpdocs问题结束。为什么没有人理解我的问题,这是我一直在犯的一个简单错误,我确信它只需要添加一个。或者*我的cp命令,我想我已经完成了。我还记得一个开发者警告我有关某事的事情。或*过去。 –

+0

有点像cp -rpf/var/www/vhosts/website/httpdocs/*/var/www/vhosts/anotherwebsite/httpdocs 你也可以看看rsync。 –

0

您需要告诉copy将目标目录视为文件而不是目录(将您列为源的文件夹复制到该目录中)。这意味着您需要-T选项。

或者,如果该glob捕获您实际关心的所有文件,则可以使用/var/www/vhosts/website/httpdocs/*的来源。这也应该起作用。

+0

我认为我的命令应该是这样的:\ cp -rpf/var/www/vhosts/newsite/httpdocs/*/var/www/vhosts/livewebsite/httpdocs但是我已经被警告使用通配符可能会导致问题。它甚至可以是\ cp -rpf /var/www/vhosts/newsite/httpdocs/.*或。到/ var/www/vhosts/livewebsite/httpdocs我只是不想以/ var/www/vhosts/livewebsite/httpdocs/httpdocs结束我只想将/ newsite/httpdocs中的文件放入/ livewebsite/httpdocs用相同的名称覆盖任何文件等。我知道如何手动mv的东西。 .. ..等,但它不是我满意的解决方案。 –

+0

我刚刚编辑我的帖子,以包括我想包括在首位的glob。我不确定那里发生了什么。使用通配符不能“导致问题”,但它确实具有您需要考虑的特定操作规则(例如,它不会匹配“.dotfiles”)。然而,'c'的'-T'选项更符合你想要的'cp'。 –

0

Wat你想要一个文件存在于aontherwebsite而不是源网站吗? 我想你想另一个网站是一个确切的副本,所以要确保先删除旧文件。

rm -r /var/www/vhosts/anotherwebsite/httpdoc 
cp -rpf /var/www/vhosts/website/httpdocs /var/www/vhosts/anotherwebsite/httpdoc 

编辑:anotherwebsite应该保持可用。 一般的诀窍是用tar:

tar cf - * | (cd /target; tar xf -) 

你的情况:

TARGET=/var/www/vhosts/anotherwebsite/httpdoc 
cd /var/www/vhosts/website/httpdocs || exit 1 
mkdir -p ${TARGET} 
[ -d ${TARGET} ] || exit 1 
tar cf - * | (cd ${TARGET}; tar xf -) 

我补充说: “|| 1号出口”,以确保你不会从错误的目录复制和$ {TARGET}是一个dir。 你仍然有3个挑战: 1)你如何删除你不再使用的文件(yesterday_special_action.html) 2)你应该先复制图像,为客户在复制图像之前打开新页面 3)什么网站做什么复制零件(磁盘已满)后,如果复制/焦点失败

我将发布解决这些挑战的新答案。

+0

我不希望先在实时网站上删除旧文件,因为在将新文件复制到实时网站的网页根目录时,网站会短时间关闭。我只想创建新文件并覆盖所有文件,我遇到的问题通常是在实际根目录(httpdocs)内的一个名为httpdocs的文件夹,因此当它应该复制内容时它看起来像httpdocs/httpdocs的httpdocs,并将它们覆盖到只有httpdocs的实时网站中,而不是复制文件夹httpdocs并将其放置在httpdocs中,并以httpdocs/httpdocs结尾 –