我正在构建一个备份脚本,其中某些目录不应包含在备份存档中。
cd /;
find . -maxdepth 2 \
\( -path './sys' -o -path './dev' -o -path './proc' -o -path './media' -o -path './mnt' \) -prune \
-o -print
这只会找到我想要的文件和目录。
问题是cpio
应该提供以下选项,以避免恢复文件时出现权限问题。
find ... -depth ....
如果我添加该-depth
选项,返回的文件和目录将包括我想要避免的文件和目录。
我真的不明白查找手册中的这些句子:
-prune True; if the file is a directory, do not descend into it. If
-depth is given, false; no effect. Because -delete implies
-depth, you cannot usefully use -prune and -delete together.
ベストアンサー1
手册上的解释是这样的:
当到达与您的表达式find
匹配的目录时,将避免进入其中。所以会去-path
-prune
find
/ ok, go inside
/home ok, go inside
/home/xxxx ok, go inside
/tmp don't go inside
/var ..etc...
但是当您使用 时-depth
,它会在目录本身之前处理目录内部。所以当为时已晚时它会匹配路径:
/home/xxxx
/home ok, go inside (it already went)
/tmp/zzzz didn't match "-path /tmp", so it's ok
/tmp don't go inside (too late!)
/var ..etc...
/
要解决这个问题你可以尝试:
只需添加带有通配符的新
-path
表达式即可。这样做的缺点是无论如何都会遍历这些子目录,只是不打印(并且它们的遍历可能会触发警告)find ... \( -path './sys' -o -path './sys/*' -o -path './dev' -o -path './dev/*' ... \) -prune ...
不要枚举要避免的目录,而是枚举要打印的目录!
find /bin /boot /etc /home /lib ...