如果解析 的输出ls
很危险,因为它可能会因某些奇怪的字符(空格、...)而中断\n
,那么了解目录中文件数量的最佳方法是什么?
我通常依靠find
避免这种解析,但同样,find mydir | wc -l
也会因为同样的原因而中断。
我现在正在 Solaris 上工作,但我正在寻找一个尽可能在不同的 unice 和不同的 shell 之间移植的答案。
答案1
这个技巧怎么样?
find . -maxdepth 1 -exec echo \; | wc -l
find
与和一样便携wc
。
答案2
在 bash 中,没有外部实用程序,也没有循环:
shopt -s dotglob
files=(*)
echo "${#files[@]}"
在 ksh 中,替换shopt -s dotglob
为FIGNORE=.?(.)
.
在 zsh 中,将其替换为setopt glob_dots
,或删除shopt
调用并使用files=(*(D))
。 (或者如果您不想包含点文件,则只需删除该行即可。)
可移植的是,如果您不关心点文件:
set -- *
echo "$#"
如果您确实想包含点文件:
set -- *
if [ -e "$1" ]; then c=$#; else c=0; fi
set .[!.]*
if [ -e "$1" ]; then c=$((c+$#)); fi
set ..?*
if [ -e "$1" ]; then c=$((c+$#)); fi
echo "$c"
答案3
find . ! -name . -prune -print | grep -c /
对于 80 后系统来说应该具有相当的可移植性。
这会计算当前目录中除.
和 之外的所有目录条目。..
还要计算子目录中的文件数量:
find .//. ! -name . | grep -c //
(这个甚至应该可以移植到 Unix V6 (1975),因为它不需要-prune
)
答案4
我一直使用且从未遇到过问题的最简单的版本是:
ls -b1 | wc -l