如何忽略按完整路径查找的目录

how to ignore directory in find by full path

我想编写一个函数来在我当前所在的当前目录中查找文件。问题是,如果我在 /home 中,我想在 sys 中查找文件, devvar 目录(在我的主文件夹中)。但如果我在根文件夹中,我希望它们被剥离。我试过这个:

find -L . \( -path '/dev' -o -path '/var' -o -path '/sys' \) -prune \
  -o -type f -print \
  -o -type d -print \
  -o -type l -print

但是它不起作用。如果我在要排除的每个路径的开头设置一个点 (.) - 它适用于根文件夹,但也会排除其他目录中的此类目录,这是我不想要的。

有没有办法通过完整(全局)文件路径进行修剪?我尝试了 -wholename 选项,但它似乎对我不起作用。

-path 不认为 /dev./dev 相同,即使 运行 在 / 中也是如此,因为 find使用 -path 时对名称执行字符串比较——它不会查找 inode 编号进行比较或执行规范化。

现在,如果您想要进行基于 inode 编号的查找,您可以这样做。

考虑:

# this relies on GNU stat for --format
listtree() {
  find -L . \( -inode "$(stat --format=%i /dev)" \
            -o -inode "$(stat --format=%i /var)" \
            -o -inode "$(stat --format=%i /sys) \) -prune \
    -o -type f -print \
    -o -type d -print \
    -o -type l -print
}

但是,请注意 inode 编号可以在不同的文件系统之间重叠。

您可以使用find "$PWD",如find "$PWD" -path '/dev' -prune -o -print,以绝对路径在当前目录中搜索。绝对路径匹配将成功。