我想知道以下两者之间有什么区别:
$ 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\nb
和file name
。重定向后:3 个文件,file
包括。这才是您的情况的真正问题。
但您可能注意到了其他一些事情:为什么a\nb
文件列在两行上。为什么 ?ls
可以列出文件,但 shell 允许在文件名中使用几乎任何类型的字符,包括换行符。因此,在解析 ls 的输出时,可能会出现错误的信息。为了正确计数文件(这是您在此处的主要目标),您可以使用for
loop 和 shell glob
abcd:$ for FILE in * ; do echo "1";done
1
1
1
正如你所见,它正确显示我有 3 个文件(包括file
之前重定向的文件)
欲了解更多信息,请参阅http://www.dwheeler.com/essays/filenames-in-shell.html