如何用命令行获得一个目录中的文件数?

我有一个有大量文件的目录。我没有看到一个ls开关来提供计数。是否有一些命令行魔法来获得文件的数量?

解决办法

使用广义的"文件&quot的定义。

ls | wc -l

(注意,它不计算隐藏的文件,并假定文件名不包含换行字符)。

为了包括隐藏的文件(除了". "和"..."),并避免换行字符的问题,典型的方法是。

find . ! -name . -prune -print | grep -c /

或者递归。

find .//. ! -name . -print | grep -c //
评论(6)

对于文件的狭义定义。

 find . -maxdepth 1 -type f | wc -l
评论(4)

如果你知道当前目录中至少有一个非隐藏的文件。

set -- *; echo "$#"

这显然是可以推广到任何glob的。

在脚本中,这有时会产生一个不幸的副作用,即覆盖了位置参数。你可以通过使用子壳或者使用函数(Bourne/POSIX版本)来解决这个问题,比如。

count_words () {
  eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"

另一个解决方案是$(ls -d -- * | wc -l)。如果glob是 "",该命令可以缩短为"$(ls | wc -l)"。解析 "ls "的输出总是让我感到不安,但在这里,只要你的文件名不包含新行,或者你的 "ls "转义了新行,它就应该工作。`$(ls -d -- 2>/dev/null | wc -l)的优点是可以优雅地处理不匹配的glob的情况(即,在这种情况下返回0,而set *`方法需要对glob是否为空进行复杂的测试)。

如果文件名可能包含换行符,另一种方法是使用$(ls -d ./* | grep -c /)

如果有很多匹配的文件,任何这些依赖于将glob的扩展传递给ls的解决方案都可能失败,因为_argument list too long_错误。

评论(6)