从排除路径时出现一些奇怪的行为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 打印的方法