2014-02-17 43 views
19

有沒有什麼方法可以在find中的-exec中使用管道?我不希望grep通過整個文件,但只能通過每個文件的第一行。如何在find中使用-exec中的管道

find /path/to/dir -type f -print -exec grep yourstring {} \; 

我試圖用「cat」和「head -1」放置管道,但是它不能很好地工作。我嘗試着用括號,但我沒有設法弄清楚到底如何把它放在那裏。 我會非常感謝您的幫助。我知道如何通過其他方式解決問題,而無需使用查找,但我們試圖在學校中使用查找和管道來完成此任務,但無法管理如何操作。

find /path/to/dir -type f -print -exec cat {} | head -1 | grep yourstring \; 

這是某種程度上我們試圖做到這一點,但不能管理括號,甚至有可能。我試圖通過網絡看,但無法找到任何答案。

+0

我投票關閉這一問題作爲題外話,因爲這是屬於unix.stackexchange.com並有一個答案了,是https://unix.stackexchange .com/questions/42407/pipe-find-into-grep -v – koppor

+0

另一個答案(對於grepping)是有的http://serverfault.com/questions/9822/recursive-text-search-with-grep-and-file -patterns – koppor

回答

28

爲了能夠使用管道,您需要執行shell命令,即帶有管道的命令必須是針對-exec的單個命令。

find /path/to/dir -type f -print -exec sh -c "cat {} | head -1 | grep yourstring" \; 

注意,上面是無用的使用貓,即可以寫成:

find /path/to/dir -type f -print -exec sh -c "head -1 {} | grep yourstring" \; 

另一種方式來實現你想要的是說:

find /path/to/dir -type f -print -exec awk 'NR==1 && /yourstring/' {} \; 
2

這並不直接回答你的問題,但如果你想做一些複雜的操作你可能會更好的腳本:

for file in $(find /path/to/dir -type f); do echo ${file}; cat $file | head -1 | grep yourstring; done