为什么我无法修剪该目录?

为什么我无法修剪该目录?

busybox version 1.33.0

我正在尝试复制整个home文件夹。

的内部home/dev/sda2/已安装,如下所示:

/home/user/sda2
/home/user/sda2/root
/home/user/sda2/home_backup

在上面您可以看到实际拥有的root/目录。此外,还有一个将存储来自.sda2/roothome_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但这不是问题,我仍然想知道为什么我无法正确“修剪”。

答案1

您的命令存在几个问题。然而,最重要的是你正在做一个cp -r.
该命令find /home ... -iname '*'将匹配每个文件和目录,包括/home其本身。所以它将运行cp -r /home /home/user/sda2/home_backup/,然后将包含该安装。

没有明智的方法可以做到这一点find。基本上,您使用了错误的工具来完成这项工作。使用rsync。传递-x选项以告诉它不要递归复制安装。

rsync -aHAXx /home /home/user/sda2/home_backup

如果由于某种原因,您无法使用rsync和/或您确实想使用find,那么您必须分多个步骤执行此操作。

第一步您需要创建目录结构:

find /home -mount -type d -execdir mkdir -p /home/user/sda2/home_backup/{} \;

请注意使用-mount代替-prune。您可以使用-prune,但-mount更简单。还要注意使用-execdir.这是因为它{}被替换为相对路径,而不是绝对路径。如果你愿意/home/user/sda2/home_backup/home/...,那么你可以使用-exec

然后你需要复制文件

find /home -mount \! -type d -execdir cp -a {} /home/user/sda2/home_backup/{} \;

请注意,为了匹配文件,我们会匹配除目录之外的所有内容。这样可以复制非文件,例如符号链接和管道。

您可以将它们合并到一个find命令中,但这只会让事情变得更加混乱。

所有这些细微差别都是为什么rsync这是一个更好的选择。

相关内容