使用find排除子目录
我有这样的目录结构
data |___ | abc |____incoming def |____incoming |____processed 123 |___incoming 456 |___incoming |___processed
Data目录中的所有文件夹中都有一个传入的子文件夹。 我想从所有的文件夹和子文件夹除def / incoming和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
:从指定的path开始recursion查找 -
-type f
:仅查找文件 -
-not -path "*def/incoming*"
:不要包含任何def/incoming
作为path的一部分 -
-not -path "*456/incoming*"
:不要包含456/incoming
任何内容作为其path的一部分
-name
只匹配文件名,而不是整个path。 你想要使用-path
而不是像def/incoming
那样修剪目录的部分。
只是为了文档:你可能需要深入挖掘,因为有很多search'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
然后,如果你想find一个文件,仍然排除pathes,只需添加| grep myFile.txt
| grep myFile.txt
。
它也可能取决于你的查找版本。 我懂了:
$ find -version GNU find version 4.2.27 Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX