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
但这不是问题,我仍然想知道为什么我无法正确“修剪”。
答案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
这是一个更好的选择。