使用find搜索*.js文件时,如何排除特定目录?

find . -name '*.js'

当前回答

避免打印修剪后的目录的一个好技巧是在-或-修剪后的右侧使用-print(也适用于-exec)。例如

find . -path "*/.*" -prune -or -iname "*.j2"

将打印当前目录下所有文件的路径,扩展名为“.j2”,跳过所有隐藏目录。Neat。但它也将打印每个正在跳过的目录的完整路径,如上所述。然而,以下内容没有。。。

find . -path "*/.*" -prune -or -iname "*.j2" -print

因为逻辑上有一个隐藏的,在iname运算符之后,在print之前。由于操作的布尔顺序和关联性,这将其绑定到-or子句的右部分。但医生说,如果没有指定它(或它的任何表亲…-print0等),就会有一个隐藏的打印。那么,为什么不是打印的左边部分呢?显然(而且我从第一次阅读手册页时就不明白这一点),如果没有-print或-exec ANYWHERE,那么这是正确的,在这种情况下,-print在逻辑上分散开来,使得所有内容都被打印出来。如果在任何子句中都表达了一个打印样式操作,那么所有隐藏的逻辑操作都将消失,您只能得到指定的内容。现在坦率地说,我可能更喜欢相反的方式,但如果只使用描述性运算符,那么查找显然不会起作用,所以我想这是有意义的。如上所述,这也适用于-exec,因此下面为每个具有所需扩展名的文件提供了完整的ls-la列表,但没有列出每个隐藏目录的第一级。。。

find . -path "*/.*" -prune -or -iname "*.j2" -exec ls -la -- {} +

对我(以及本线程中的其他人)来说,find语法很快就变得非常复杂,所以我总是插入括号以确保我知道什么绑定到什么,所以我通常创建一个用于类型能力的宏,并形成所有这样的语句,如。。。

find . \( \( ... description of stuff to avoid ... \) -prune \) -or \
\( ... description of stuff I want to find ... [ -exec or -print] \)

这样把世界分成两部分是很难出错的。我希望这会有所帮助,尽管似乎不太可能有人读到第30个以上的答案并投票支持,但我们可以希望

其他回答

我更喜欢-不是符号。。。它更可读:

find . -name '*.js' -and -not -path directory

如何在sh中使用find的prune选项是Laurence Gonsalves关于prune如何工作的一个很好的答案。

下面是通用解决方案:

find /path/to/search                    \
  -type d                               \
    \( -path /path/to/search/exclude_me \
       -o                               \
       -name exclude_me_too_anywhere    \
     \)                                 \
    -prune                              \
  -o                                    \
  -type f -name '*\.js' -print

要避免多次键入/path/To/seach/,请将查找包装在pushd中。。popd对。

pushd /path/to/search;                  \
find .                                  \
  -type d                               \
    \( -path ./exclude_me               \
       -o                               \
       -name exclude_me_too_anywhere    \
     \)                                 \
    -prune                              \
  -o                                    \
  -type f -name '*\.js' -print;         \
 popd

以下命令有效:

find . -path ./.git -prune -o -print

如果查找有问题,请使用-D树选项查看表达式分析信息。

find -D tree . -path ./.git -prune -o -print

或者使用-D all,查看所有执行信息。

find -D all . -path ./.git -prune -o -print

使用-prune主键。例如,如果要排除/其他:

find . -path ./misc -prune -o -name '*.txt' -print

要排除多个目录,请在括号中对它们进行“或”运算。

find . -type d \( -path ./dir1 -o -path ./dir2 -o -path ./dir3 \) -prune -o -name '*.txt' -print

而且,要在任何级别排除具有特定名称的目录,请使用-name primary而不是-path。

find . -type d -name node_modules -prune -o -name '*.json' -print

如果-prune对你不起作用,这将:

find -name "*.js" -not -path "./directory/*"

注意:需要遍历所有不需要的目录。