我试图计算目录中文件的总行数。为此,我尝试使用find和wc的组合。但是,当我运行find . -exec wc -l {}\;
时,我收到错误find: missing argument to -exec
。我看不出任何明显的问题,任何想法?
答案 0 :(得分: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
管道命令以这种方式出现的问题是,如果任何文件中有空格,它就会中断。例如,如果文件名为“ab”,wc
将分别收到“a”,然后是“b”,您显然会收到2条错误消息:a: no such file
和b: no such file
。< / p>
除非您知道您的文件名中没有任何空格(或不可打印的字符),否则如果您需要将命令一起管道,则需要告诉所有工具您正在一起使用NULL字符(\ 0)作为分隔符而不是空格。所以上一个命令将成为:
find . -type f -print0 | xargs -0 wc -l
答案 1 :(得分:1)
对于bash
版本4.0或更高版本,您根本不需要find
命令:
shopt -s globstar
wc -l **/*
没有简单的方法可以跳过目录,正如您可能想要的Gui Rava所指出的那样,除非您可以仅通过名称来区分文件和目录。例如,目录中的名称可能永远不会有.
,而所有文件都至少有一个扩展名:
wc -l **/*.*