我有一个文件系统
/x/./
目录x
包含目录a
,b
,c
,y
。
我想查找所有内容/x/./
但不在/x/y/./
中找到
我该怎么写?
我试过
find /x/./ -path "/x/y/" -prune -type f
但它不起作用。为什么呢?
答案 0 :(得分:2)
find
非常直接。它不会将/x/y/
视为低于/x/./
,因为它不是/x/./y/
,即使这两个路径引用同一目录。如果没有给出明确的逻辑连接词,你可能也会遇到组合操作的问题,我永远不会记住它的工作方式(一直使用显式连接词更容易)。
当.
本身不是整个路径名时,将其遗漏总是安全的,在这种情况下,也不需要使用尾部斜杠。尝试改为
find "/x" -path "/x/y" -prune -o -type f -print
在这种情况下,双引号在技术上也是不必要的,但如果路径名包含任何特殊字符,则它们是必要的。
编辑:如果你知道你要查找的文件是两个级别,你告诉find
搜索开始两个级别。有两种可能性:您知道包含所需文件的子目录的名称 -
# by definition nothing in /x/a/foo can be under /x/y
find "/x/a/foo" -type f -print
- 或者你没有 -
# The stars in the first argument have to be outside the quotes,
# so the shell expands them. The stars in the -path argument have to
# be inside quotes so the shell *doesn't* expand them.
find "/x/"*/* -path "/x/y/*" -prune -o -type f -print
逻辑连接词很难解释。 -path whatever
和-type f
的行为与if
条件相似,而-prune
和-print
的行为与条件块中的内容相似,-o
在此上下文中表现更像else
而不是or
;但这太简单了,细节很重要。请阅读整个 GNU find manual。如果您在执行此操作后仍不确定某事,请在此处提出新问题。
答案 1 :(得分:1)
find /x -type d -path /x/y -prune -o -type f -print
这将排除y目录。