我想知道是否可以根据原点名称将文件复制/移动到目的地。
基本上,我有一个/ 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,因为我只能对文件进行写访问,而不是目录。
答案 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)
我不清楚你想做什么,但你可以尝试以下方法:
for file in /mail/*; do
mv -f $file /home/username/mail/$(basename $file)
done
这会将/ mail中的每个文件和子目录从那里移到/ home / username / mail。
答案 2 :(得分:0)
使用tar
选项吗?您可以tar
向上/mail/
目录,并在tar
下提取它(因为我假设这是您想要的大致){{1}}覆盖现有文件和目录。
答案 3 :(得分:0)
我对你想要做的事情感到有点困惑。但是你应该能够使用Adam解决方案的方法并将错误重定向到文件。
for file in /mail/*; do
mv -f $file /home/username/mail/$(basename $file) 2> /tmp/mailbackup.username.errors
done
DIrectories不会被覆盖,您可以检查该文件,以便它只会包含您预期的错误。
答案 4 :(得分:0)
你能再解开一次吗? tar 的-P选项不会删除前导“/”,因此将遵循绝对路径名。从您的编辑中,听起来就像是要修复它。
答案 5 :(得分:0)
即使你的澄清,我仍然有一个问题,你正在理解你正在做什么。但是,你有可能使用rsync吗? src和dest主机可以是rsync的同一主机。我记得,您可以告诉rsync只更新目标区域中已存在的文件(--existing),并忽略目录更改(--omit-dir-times)。
同样,我不太了解您的需求,但rsync在备份文件和目录方面非常灵活。
祝你好运。