我觉得这是一个非常简单的问题,但是我找不到一个简单的正则表达式答案。基本上,我尝试使用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
答案 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