>我有这样的目录结构
data
|___
|
abc
|____incoming
def
|____incoming
|____processed
123
|___incoming
456
|___incoming
|___processed
数据目录中的所有文件夹中都有一个传入的子文件夹。我想从所有文件夹和子文件夹中获取除 def/传入和 456/传入目录之外的所有文件。我尝试使用以下命令
find /home/feeds/data -type d ( -name 'def/incoming' -o -name '456/incoming' -o -name arkona ) -prune -o -name '*.*' -print
但它没有按预期工作。
拉维
这有效:
find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"
解释:
-
find /home/feeds/data
:开始从指定路径递归查找 -
-type f
:仅查找文件 -
-not -path "*def/incoming*"
:不要包含任何带有def/incoming
的内容作为其路径的一部分 -
-not -path "*456/incoming*"
:不要包含任何带有456/incoming
作为其路径的一部分的内容
只是为了文档:您可能需要更深入地挖掘,因为有许多搜索'n'skip星座(就像我不得不这样做的那样)。事实证明,prune
是你的朋友,而-not -path
不会做你所期望的。
因此,这是 15 个排除目录的查找示例的宝贵示例:
http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html
为了链接到最初的问题,排除最终对我有用,如下所示:
find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print
然后,如果您希望找到一个文件但仍排除路径,只需添加 | grep myFile.txt
.
这可能还取决于您的查找版本。明白了:
$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX
-name
只匹配文件名,而不是整个路径。您希望改用-path
,用于要修剪目录的部分,例如 def/incoming
.
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"
通过以下答案 如何在查找中排除目录 . 命令:
find . ( -name ".git" -o -name "node_modules" ) -prune -o -print
我所做的排除所有.git
目录并将其传递给-exec
以在
find . -not -path '*/.*' -type f -exec grep "pattern" [] ;
-
-not -path '*/.*'
将排除所有隐藏目录 -
-type f
只会列出类型文件,然后您可以将其传递给-exec
或任何您想要做的事情