2014-10-06 73 views
0

我正試圖計算目錄中文件的總行數。要做到這一點,我正在嘗試使用find和wc的組合。但是,當我運行find . -exec wc -l {}\;時,我收到錯誤find: missing argument to -exec。我看不到任何明顯的問題,有什麼想法?查找-exec不能識別參數

+5

您錯過了一個空格:'find。 -exec wc -l {} \;'('\;'前面的空格)。 – 2014-10-06 17:20:52

+0

我不是一個聰明的人 – ragingSloth 2014-10-06 17:22:09

回答

4

你只需要一個空間{}\;之間

find . -exec wc -l {} \; 

需要注意的是,如果有從當前位置的任何子目錄,wc會爲他們每個人,看起來像一個錯誤信息:

wc: ./subdir: Is a directory 

爲了避免這樣的問題,你可能想告訴find限制搜索到的文件:

find . -type f -exec wc -l {} \; 

另一個注意:使用-exec選項的好主意。太多時候,人們管命令一起思維來得到相同的結果,例如這裏將是:

find . -type f | xargs wc -l 

在這樣的管道命令的問題是,它打破,如果任何文件中有空格在裏面。例如,如果文件名是「a b」,則wc將分別接收「a」和「b」,並且顯然會得到2個錯誤消息:a: no such fileb: no such file

除非您知道您的文件名中沒有空格(或不可打印的字符),否則您需要告知所有您一起管道的工具使用NULL字符(\ 0)作爲分隔符而不是空格。所以前面的命令將變成:

find . -type f -print0 | xargs -0 wc -l 
+0

而且,更好的是,POSIX規定用'+'代替'';'(或'\;')的作用與使用'xargs'幾乎一樣。 'find'將一堆文件名分組在一起,每N個文件名(N不是可控數量,但取決於參數列表的最大長度和文件名的長度)運行一次命令。 – 2014-10-06 20:28:33

1

4.0或更高版本的bash版本,你不需要你find命令不惜一切:

shopt -s globstar 
wc -l **/* 

有跳過目錄,沒有簡單的方法,其作爲Gui Rava指出你可能想要這樣做,除非你可以通過名字來區分文件和目錄。例如,可能目錄中永遠不會有.的名稱,而所有文件至少有一個擴展名:

wc -l **/*.*