2008-12-12 69 views
2

我想知道是否可以根据源名称将文件复制/移动到目的地。bash脚本。复制文件而不覆盖

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

我得到的错误,如MV:不能覆盖目录`/home/username/mail/username.com”

我想要做的就是在目录username.com每个文件,将其移动到邮件中的同名文件夹。可以有任意数量的文件夹来代替username.com,并有独立的子目录。

这样做的最好方法是什么?

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

编辑:澄清

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

回答

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”;第二种方法是“从标准输入读取”; '-F'选项表示'读取文件名以从指定文件复制'。

0

我不是它是什么,你想做的事完全清楚,但你可以尝试以下方法:

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

这将每个文件和子目录中移动/邮件从那里进入/家/用户名/邮件。

+0

我认为这与我想要做的相反?我提取了一个邮件存档到邮件文件夹中,但是它创建了邮件下的一个子目录,我现在无法恢复,因为我无法覆盖原始目录 – 2008-12-12 16:29:38

0

是否使用tar选项?你可以tar上的目录,并提取它/mail/(因为我假设这是你想粗略)与tar覆盖现有的文件和目录。

+0

这就是我试过的,问题是我只能覆盖文件,而不是目录 – 2008-12-12 16:44:21

0

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

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

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

+0

问题是我无法覆盖目录,只有文件和我的邮件存档目前位于邮件的subdirectoy中。使用普通工具恢复它似乎是不可能的。 – 2008-12-12 16:45:19

+0

是的,但我认为如果你尝试类似于我所建议的那样,将会移动所有文件,并且npt能够覆盖目录的所有错误消息都将被重定向到日志文件。 – PEZ 2008-12-13 07:35:37

0

你能再次解开它吗? tar的-P选项不会剥去前导“/”,所以绝对路径名将受到尊重。从你的编辑中,这听起来像会解决它。

+0

我试过了,它给出了错误:tar:/ home/username/mail:在用tar tar xzvfP〜/ new/moremail.tgz〜/ mail – 2008-12-12 17:16:16

0

即使有你的澄清,我仍然有一个问题,你完全明白你在做什么。但是,有什么机会可以使用rsync? src和dest主机可以是rsync的同一主机。我记得,你可以告诉rsync只更新已经存在于目标区域(--existing)的文件,也可以忽略目录更改(--omit-dir-times)。

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

祝你好运。