busybox version 1.33.0
我正在尝试复制整个home
文件夹。
在home
,内部/dev/sda2/
安装,如下所示:
/home/user/sda2
/home/user/sda2/root
/home/user/sda2/home_backup
您可以在上面看到root/
目录sda2/
,由实际拥有root
。此外,还有home_backup/
哪些将存储来自/home
.
我的问题是:
执行以下行后,我得到了一个很好的文件列表,/home/user/sda2
并且它的内容无处可寻,这正是我想要的:
LC_ALL=C find /home -path /home/user/sda2 -prune -o -iname '*' -print \;
但是对于以下内容,我总是收到operation not permitted
目录错误root/
(准确,我不是所有者,普通用户),这意味着它不会sda2
像我预期的那样修剪:
LC_ALL=C find /home -path /home/user/sda2 -prune -o -iname '*' -exec cp -r '{}' /home/user/sda2/home_backup/ ;/
由于显而易见的原因/home/user/sda2
,必须排除,不要一遍又一遍地复制相同的数据。
检查这个并不能真正回答我的问题,但它让我对如何prune
工作有了一个概念。
https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh/1489405#1489405
编辑
我刚刚意识到,在上一行中,所有文件都将混合在一起,home_backup
但这不是问题,我仍然想知道为什么我不能正确“修剪”。
您的命令有几个问题。然而,最重要的是你正在做一个
cp -r
.该命令
find /home ... -iname '*'
将匹配每个文件和目录,包括/home
它自己。所以它将运行cp -r /home /home/user/sda2/home_backup/
,然后将包含该挂载。没有理智的方法可以做到这一点
find
。基本上你使用了错误的工具来完成这项工作。使用rsync
. 通过-x
选项告诉它不要递归复制挂载。如果由于某种原因,您不能使用
rsync
和/或您真的想使用find
,那么您必须分多个步骤执行此操作。您需要创建目录结构的第一步:
注意使用
-mount
代替-prune
。您可以使用-prune
,但-mount
更简单。还要注意-execdir
. 这是因为它{}
被相对路径而不是绝对路径替换。如果你愿意/home/user/sda2/home_backup/home/...
,那么你可以使用-exec
.然后你需要复制文件
请注意,为了匹配文件,我们将匹配除目录之外的所有内容。这是为了复制非文件,如符号链接和管道。
您可以将它们合并到一个
find
命令中,但这只会让它变得更加混乱。所有这些细微差别都是为什么
rsync
是一个更好的选择。