unix - 在目录x中查找文件但排除目录y

时间:2013-09-17 19:15:25

标签: shell unix

我有一个文件系统

/x/./

目录x包含目录abcy。 我想查找所有内容/x/./但不在/x/y/./中找到 我该怎么写?

我试过

find /x/./ -path "/x/y/" -prune -type f

但它不起作用。为什么呢?

2 个答案:

答案 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目录。