我有一个有大量文件的目录。我没有看到一个ls
开关来提供计数。是否有一些命令行魔法来获得文件的数量?
使用广义的"文件"的定义。
ls | wc -l
(注意,它不计算隐藏的文件,并假定文件名不包含换行字符)。
为了包括隐藏的文件(除了". "和"..."),并避免换行字符的问题,典型的方法是。
find . ! -name . -prune -print | grep -c /
或者递归。
find .//. ! -name . -print | grep -c //
对于文件的狭义定义。
find . -maxdepth 1 -type f | wc -l
如果你知道当前目录中至少有一个非隐藏的文件。
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_错误。