Linux查找命令-根据文件名排除查找

时间:2019-02-14 19:55:47

标签: linux find

我觉得这是一个非常简单的问题,但是我找不到一个简单的正则表达式答案。基本上,我尝试使用find来获取系统中所有文件的列表,其中包括一些排除项。这些排除之一是任何以.Foo.cs结尾的文件或任何名为FooInfo.cs的文件。我已经从搜索中成功排除了几个目录,但是似乎无法排除这两个文件。我已经尝试过使用-name,但是-name甚至可以做到这一点吗?下面是我的表情。谢谢。

find . ! -name 'FooInfo.cs' ! -name '*.Foo.cs'  -type d \( -name Foo-o -name 2Foo -o -name 2_Foo \) -prune -o -type f ! -size 0 \( -name "*.java" -o -name "*.cs" -o -name "*.cpp" -o -name "*.cxx" -o -name "*.cc" -o -name "*.c" -o -name "*.h" -o -name "*.scala" -o -name "*.css" -o -name "*.html" -o -name "*.bat" -o -name "*.js" \) -exec realpath {} \;| xargs grep -L CUSTOMERINFO  | sed -e 's/$/\r/g' >> ../output.txt

1 个答案:

答案 0 :(得分:0)

所以我不确定为什么,但是最终通过更改排除对象的顺序来解决此问题。并非从一开始就排除在外,而是进行以下工作(将! -name '.FOO.cs'! -name '.fooinfo.cs'移到声明type -f之后的右边)。

我认为这是可行的,因为它们是文件,因此必须用type -f标记。但是,如果您知道原因,请在下面评论并更正。

find . -type d \( -name Foo-o -name 2Foo -o -name 2_Foo \) -prune -o -type f ! -size 0 ! -name 'FooInfo.cs' ! -name '*.Foo.cs'   \( -name "*.java" -o -name "*.cs" -o -name "*.cpp" -o -name "*.cxx" -o -name "*.cc" -o -name "*.c" -o -name "*.h" -o -name "*.scala" -o -name "*.css" -o -name "*.html" -o -name "*.bat" -o -name "*.js" \) -exec realpath {} \;| xargs grep -L CUSTOMERINFO  | sed -e 's/$/\r/g' >> ../output.txt