目录中计数

目录中计数

我想知道以下两者之间有什么区别:

$ ls | wc -l

$ ls > foo
$ wc -l < foo

计算当前目录中的所有文件时。为什么第二个会多给我一个文件?

答案1

实际上没有区别。第二种情况也会将文件包含foo在列表中,因此计数会多 1。

答案2

你正在做的 ls > foo是将 ls 的输出重定向到一个文件。令人惊讶的是,该文件首先被创建,并包含在ls

   abcd:$ ls                                                                      
a?b  file name

abcd:$ ls > file                                                               

abcd:$ cat file
a
b
file
file name

重定向之前,有两个文件a\nbfile name。重定向后:3 个文件,file包括。这才是您的情况的真正问题。

但您可能注意到了其他一些事情:为什么a\nb文件列在两行上。为什么 ?ls可以列出文件,但 shell 允许在文件名中使用几乎任何类型的字符,包括换行符。因此,在解析 ls 的输出时,可能会出现错误的信息。为了正确计数文件(这是您在此处的主要目标),您可以使用forloop 和 shell glob

abcd:$ for FILE in * ; do echo "1";done                                                                                               
1
1
1

正如你所见,它正确显示我有 3 个文件(包括file之前重定向的文件)

欲了解更多信息,请参阅http://www.dwheeler.com/essays/filenames-in-shell.html

相关内容