查找:将 -depth 与 -prune 结合起来以提供 cpio

查找:将 -depth 与 -prune 结合起来以提供 cpio

我正在构建一个备份脚本,其中某些目录不应包含在备份存档中。

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-prunefind

/             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...
/

要解决这个问题你可以尝试:

  1. 只需添加带有通配符的新-path表达式即可。这样做的缺点是无论如何都会遍历这些子目录,只是不打印(并且它们的遍历可能会触发警告)

    find ... \( -path './sys' -o -path './sys/*' -o -path './dev' -o -path './dev/*' ... \) -prune ...

  2. 不要枚举要避免的目录,而是枚举要打印的目录!

    find /bin /boot /etc /home /lib ...

おすすめ記事