如何递归地计数Linux目录中的文件?
我发现了这个:
find DIR_NAME -type f ¦ wc -l
但是当我运行它时,它返回以下错误。
查找:路径必须在表达式之前:
如何递归地计数Linux目录中的文件?
我发现了这个:
find DIR_NAME -type f ¦ wc -l
但是当我运行它时,它返回以下错误。
查找:路径必须在表达式之前:
当前回答
要确定当前目录中有多少文件,输入ls -1 | wc -l。这使用wc对ls -1输出中的行数(-l)进行计数。它不计算dotfiles。请注意,我在以前版本的HOWTO中使用的ls -l(这是一个“L”而不是前面例子中的“1”)实际上会给你一个比实际计数大1的文件计数。这一点要感谢内贾德。
如果你想只计算文件而不包括符号链接(这只是一个你可以做的其他事情的例子),你可以使用ls -l | grep -v ^l | wc -l(这是一个“l”而不是“1”,我们想要一个“长”列表)。Grep检查以“l”开头的任何行(表示链接),并丢弃该行(-v)。
相对速度:“ls -1 /usr/bin/ | wc -l”在未加载的486SX25上大约需要1.03秒(在此机器上/usr/bin/有355个文件)。“ls -l /usr/bin/ | grep -v ^l | wc -l”大约耗时1.19秒。
来源:http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html
其他回答
这应该可以工作:
find DIR_NAME -type f | wc -l
解释:
-type f只包括文件。 |(而不是……)将find命令的标准输出重定向到wc命令的标准输入。 Wc (word count的缩写)对输入(docs)的换行、单词和字节进行计数。 -l只计算换行。
注:
将DIR_NAME替换为。执行当前文件夹中的命令。 您还可以删除类型f以在计数中包括目录(和符号链接)。 如果文件名可以包含换行符,这个命令可能会被高估。
解释为什么你的例子不起作用:
在您所显示的命令中,您没有使用“Pipe”(|)来连接两个命令,而是使用了shell不将其识别为命令或类似内容的断线(δ)。这就是为什么你会得到错误消息。
综合这里的几个答案,最有用的解决方案似乎是:
find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n
它可以处理一些奇怪的东西,比如文件名中包含空格、圆括号甚至新行。它还根据文件数量对输出进行排序。
您可以增加-maxdepth后的数字,以获得子目录的计数。请记住,这可能会花费很长时间,特别是如果您有一个高度嵌套的目录结构,并结合了一个高-maxdepth值。
对于当前目录:
find -type f | wc -l
找到-type f | wc -l
OR(如果目录是当前目录)
找到。-type f | wc -l
要确定当前目录中有多少文件,输入ls -1 | wc -l。这使用wc对ls -1输出中的行数(-l)进行计数。它不计算dotfiles。请注意,我在以前版本的HOWTO中使用的ls -l(这是一个“L”而不是前面例子中的“1”)实际上会给你一个比实际计数大1的文件计数。这一点要感谢内贾德。
如果你想只计算文件而不包括符号链接(这只是一个你可以做的其他事情的例子),你可以使用ls -l | grep -v ^l | wc -l(这是一个“l”而不是“1”,我们想要一个“长”列表)。Grep检查以“l”开头的任何行(表示链接),并丢弃该行(-v)。
相对速度:“ls -1 /usr/bin/ | wc -l”在未加载的486SX25上大约需要1.03秒(在此机器上/usr/bin/有355个文件)。“ls -l /usr/bin/ | grep -v ^l | wc -l”大约耗时1.19秒。
来源:http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html