2013-08-26 36 views
0

我想查找文件目錄中的特定模式,並希望在顯示結果時排除某些模式。從查找命令的結果中過濾文件

我用下面的命令

find . -type f -exec grep -il 'foo' {} \; | find . -not -name "*.jar" -not -name "*.gz" -not -name "*.log" 2>/dev/null 

顯示結果的時候,我看到了以下錯誤消息

find: grep terminated by signal 13 

是否有人可以指導我,爲什麼此錯誤消息是存在的,如果有一個更好的命令可用於獲取所需的結果(基本上不包括jar文件或日誌文件或結果集中的其他類型的文件)?

回答

3

我想你想在管道下半年使用findgrep; find不能像那樣工作。你應該做的是有它全部在一個命令:

find . -type f -not -name "*.jar" -not -name "*.gz" -not -name "*.log" -exec grep -il 'foo' + 2>/dev/null 

或者

find . -type f -not -name "*.jar" -not -name "*.gz" -not -name "*.log" -exec grep -qi 'foo' \; -print 2>/dev/null 

還是讓grep遍歷樹本身和(使用grep,不find)後的名稱進行篩選:

grep -irl foo . | grep -v -e '\.jar$' -e '\.gz$' -e '\.log$' 
+0

感謝了很多的快速反應..它工作.. – user1588737

1
find . | grep -v "jar$" | grep -v "log$" | grep -v "gz$" 
0

該錯誤

find: grep terminated by signal 13 

是由於find不接受來自管道的輸入。把-name參數從第一個找到的第二個找到。同樣使用-exec的論點來發現幾乎總是做錯的事情;它爲每個grep產生一個新的進程。這是一個很好的地方使用xargs,而不是:

find . -type f -not -name "*.jar" -not -name "*.gz" -not -name "*.log" -print0 2> /dev/null | xargs -0 grep -il 'foo' 2> /dev/null