bash脚本...复制文件而不覆盖

时间:2008-12-12 16:14:45

标签: bash

我想知道是否可以根据原点名称将文件复制/移动到目的地。

基本上,我有一个/ mail文件夹,它有几个子文件夹,如cur和new等。然后我在/ mail / home / username中提取了一个重复的备份。 mv -f不起作用,因为我没有权限覆盖目录,只覆盖其中的文件。

我收到mv等错误:无法覆盖目录`/home/username/mail/username.com'

我想要做的是对象目录username.com中的每个文件,将其移动到/ mail中同名的文件夹。可以有任意数量的文件夹代替username.com,它们有独立的子目录。

这样做的最佳方式是什么?

我必须这样做,因为我只能通过php访问我的主机ftp和bash。

编辑:澄清

我想我需要澄清发生了什么。我在共享主机上,显然没有对目录本身的写访问权限。至少主要的是诸如mail和public_html。我用tar备份了〜/ mail,但是在尝试将它解压缩到〜/ mail / home / mail等时,我忘记了完整的路径。现在,我不能简单地解压,因为路径是错误的,我不能mv -f,因为我只能对文件进行写访问,而不是目录。

6 个答案:

答案 0 :(得分:2)

要进行复制,您应该考虑在“通行证”模式(cpio)中使用-p

cd /mail; find . -type f | cpio -pvdmB /home/username/mail

-v用于详细; -d根据需要创建目录; -m保留文件的修改时间; -B表示使用更大的块大小,并且在这里可能不相关(它在用于处理磁带设备时会产生影响)。从此列表中省略的是-u标志,它执行无条件复制,覆盖目标区域中的预先存在的文件。 cd命令确保路径名称正确;如果你刚刚做了:

find /mail -type f | cpio -pvdmB /home/username

你会得到相同的结果,但只是巧合 - 因为/home/username下的子目录与原始的绝对路径名相同。如果你需要这样做:

find /var/spool/mail -type f | cpio -pvdmB /home/username/mail

然后复制的文件将在/home/username/mail/var/spool/mail下找到,这不太可能是您的想法。

您可以使用(GNU)tar实现类似的效果:

(cd /mail; tar -cf - . ) | (cd /home/username/mail; tar -xf - )

这会复制目录,而不仅仅是文件。为此,您需要仅限GNU的设施:

(cd /mail; find . -type f | tar -cf - -F - ) | (cd /home/username/mail; tar -xf - )

第一个独奏短跑意味着'写入stdout';第二个意思是“从stdin读取”; '-F'选项意味着'读取要从指定文件中复制的文件名'。

答案 1 :(得分:0)

使用tar选项吗?您可以tar向上/mail/目录,并在tar下提取它(因为我假设这是您想要的大致){{1}}覆盖现有文件和目录。

答案 2 :(得分:0)

我对你想要做的事情感到有点困惑。但是你应该能够使用Adam解决方案的方法并将错误重定向到文件。

for file in /mail/*; do
    mv -f $file /home/username/mail/$(basename $file) 2> /tmp/mailbackup.username.errors
done

DIrectories不会被覆盖,您可以检查该文件,以便它只会包含您预期的错误。

答案 3 :(得分:0)

你能再解开一次吗? tar 的-P选项不会删除前导“/”,因此将遵循绝对路径名。从您的编辑中,听起来就像是要修复它。

答案 4 :(得分:0)

即使你的澄清,我仍然有一个问题,你正在理解你正在做什么。但是,你有可能使用rsync吗? src和dest主机可以是rsync的同一主机。我记得,您可以告诉rsync只更新目标区域中已存在的文件(--existing),并忽略目录更改(--omit-dir-times)。

同样,我不太了解您的需求,但rsync在备份文件和目录方面非常灵活。

祝你好运。

答案 5 :(得分:0)

我不清楚你想做什么,但你可以尝试以下方法:

for file in /mail/*; do
    mv -f $file /home/username/mail/$(basename $file)
done

这会将/ mail中的每个文件和子目录从那里移到/ home / username / mail。

豫ICP备18024241号-1