打印不包括目录的文件数

打印不包括目录的文件数

我了解到那是| 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.

对于zshshell,您还可以使用 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

相关内容