使用find搜索*.js文件时,如何排除特定目录?
find . -name '*.js'
使用find搜索*.js文件时,如何排除特定目录?
find . -name '*.js'
当前回答
对于那些在旧版本UNIX上无法使用-path或-not的用户
在SunOS 5.10 bash 3.2和SunOS 5.11 bash 4.4上测试
find . -type f -name "*" -o -type d -name "*excluded_directory*" -prune -type f
其他回答
我在C源文件exclude*.o和exclude*.swp以及exclude(非常规文件)和exclude-dir输出中找到了函数名:
find . \( ! -path "./output/*" \) -a \( -type f \) -a \( ! -name '*.o' \) -a \( ! -name '*.swp' \) | xargs grep -n soc_attach
我使用find为xgettext提供文件列表,并希望省略特定目录及其内容。我尝试了许多-path与-prune组合的排列,但无法完全排除我想要删除的目录。
虽然我能够忽略我想要忽略的目录内容,但find随后将目录本身作为结果之一返回,结果导致xgettext崩溃(不接受目录,只接受文件)。
我的解决方案是简单地使用grep-v跳过结果中不需要的目录:
find /project/directory -iname '*.php' -or -iname '*.phtml' | grep -iv '/some/directory' | xargs xgettext
我不能肯定,是否有一个论据支持这一发现,它能100%奏效。在头痛之后,使用grep是一个快速而简单的解决方案。
这是唯一一个对我有用的。
find / -name MyFile ! -path '*/Directory/*'
正在搜索“MyFile”,不包括“Directory”。强调星星*。
您可以使用修剪选项来实现这一点。例如:
find ./ -path ./beta/* -prune -o -iname example.com -print
或者反向grep“grep-v”选项:
find -iname example.com | grep -v beta
您可以在Linux find命令exclude directories from search中找到详细的说明和示例。
避免打印修剪后的目录的一个好技巧是在-或-修剪后的右侧使用-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个以上的答案并投票支持,但我们可以希望