当权限被拒绝时,查找路径排除不起作用

当权限被拒绝时,查找路径排除不起作用

从排除路径时出现一些奇怪的行为find:

find ~ -not -path "~/sandboxes/*" -name 'some-file.vmdk'

给出:

/home/user/VMs/win/some-file.vmdk
find: ‘/home/user/sandboxes/debian7.amd64.buildd/root/...’: Permission denied
find: ‘/home/user/sandboxes/debian7.amd64.buildd/var/...’: Permission denied

怎么了?

PS不幸的是-prune也不起作用:

find ~ -path "/home/user/sandboxes/*" -prune -o -name 'some-file.vmdk'

给出了更奇怪的结果:

/home/user/nemu_vm/win/some-file.vmdk
/home/user/sandboxes/debian7.amd64.buildd
/home/user/sandboxes/debian9.amd64.buildd

有用的链接

答案1

你的命令

find ~ -path "/home/user/sandboxes/*" -prune -o -name 'some-file.vmdk'

印刷

/home/user/sandboxes/debian7.amd64.buildd
/home/user/sandboxes/debian9.amd64.buildd

因为未提供任何操作时的默认操作是输出找到的路径名。找到上述路径名,然后修剪这些路径。修剪搜索路径不会排除打印这些路径名。

但是,如果您添加-print到最后,如

find "$HOME" -path "$HOME/sandboxes" -prune -o -name 'some-file.vmdk' -print

那么这些路径名就会不是被打印。这是因为现在您有一个显式操作(-print),因此不会触发默认操作。仅-print适用于 的右侧-o

请注意,不需要*,并且该变量$HOME比 更容易使用~,尤其是在脚本中。


你的第一个命令,

find ~ -not -path "~/sandboxes/*" -name 'some-file.vmdk'

很可能不起作用,因为~未在引号内扩展。

假设您使用的是$HOME,它也不会修剪搜索路径,这意味着它仍然会输入~/sandboxes,但它永远不会打印该路径下的任何路径名。由于它进入了目录,当它到达无法访问的目录时,它仍然会给你权限错误。

答案2

你可以尝试这样:

find ~ \! -path "*/sandboxes/*" -name 'some-file.vmdk'

或者使用 -prune :

find ~ -path "*/sandboxes" -prune -o -name 'some-file.vmdk'

但找不到删除 ~/sandboxes 打印的方法

相关内容