如何忽略按完整路径查找的目录
how to ignore directory in find by full path
我想编写一个函数来在我当前所在的当前目录中查找文件。问题是,如果我在 /home
中,我想在 sys
中查找文件, dev
和 var
目录(在我的主文件夹中)。但如果我在根文件夹中,我希望它们被剥离。我试过这个:
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
,以绝对路径在当前目录中搜索。绝对路径匹配将成功。
我想编写一个函数来在我当前所在的当前目录中查找文件。问题是,如果我在 /home
中,我想在 sys
中查找文件, dev
和 var
目录(在我的主文件夹中)。但如果我在根文件夹中,我希望它们被剥离。我试过这个:
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
,以绝对路径在当前目录中搜索。绝对路径匹配将成功。