我了解到那是| wc -l'命令打印当前目录中的文件数,但它包括所有文件和目录。我可以只对不包括目录的纯文件执行相同的任务吗?
答案1
目录只是多种文件类型中的一种。其他类型包括符号链接,先进先出,设备,常规的,插座...
在 的输出中ls -n
,第一个字符表示类型。d
对于目录,-
对于常规的,l
为了符号链接,所以你可以这样做:
LC_ALL=C ls -Aqn | LC_ALL=C grep -c '^-' # regular files only
LC_ALL=C ls -Aqn | LC_ALL=C grep -vc '^d' # anything but directory
(-A
如果您不想计算隐藏文件,请删除该选项)。
你也可以做检查符号链接解析后,
LC_ALL=C ls -LAqn | LC_ALL=C grep -c '^-' # regular files or symlinks to regulars
LC_ALL=C ls -LAqn | LC_ALL=C grep -vc '^d' # anything but directory and symlinks to dirs.
对于zsh
shell,您还可以使用 globbing 来完成此操作:
(){print $#} *(NDoN.) # regular
(){print $#} *(NDoN^/) # non-directories
符号链接解析后(添加-
glob 限定符):
(){print $#} *(NDoN-.) # regular
(){print $#} *(NDoN-^/) # non-directories
(D
如果您不想计算隐藏文件,请删除限定符)。
oN
是禁用文件列表的排序作为优化,因为我们不关心顺序。 GNU 实现ls
有一个-U
选项。
无论如何,您的ls | wc -l
错误是因为它计算了用于分隔文件名的换行符数量ls
(每个文件一个),而且还计算了文件名中的换行符数量(它还忽略了隐藏文件)。使用该-q
选项可以解决这个问题,因为它会导致文件名中的换行符呈现为?
.
答案2
我通常会使用:
find . -maxdepth 1 -type f | wc -l
请注意:
- 这也计算以以下开头的文件名
.
- 只查看常规文件(不是 fifo、符号链接等)
答案3
我还不能发表评论,但这是一个特定于 bash 的解决方案。它不是那么简洁,但如果不使用 可能会感觉更干净grep
。
由于您只使用了ls
我假设您不需要隐藏文件。
i=0
for f in *
do
[[ -f "$f" ]] && let "i++"
done
echo $i
或者组合成单行,i=0; for f in *; do [[ -f "$f" ]] && let "i++"; done; echo $i