文件列表:ls 和 echo * 之间的区别

文件列表:ls 和 echo * 之间的区别

在目录中有数千个文件的lustre文件系统上,每次我键入时,ls在列出文件之前都会有很大的延迟。其他需要文件列表的命令也会发生同样的情况。但如果我输入,echo *我很快就会得到文件的名称。

ls与类似命令访问文件系统相比,机制/内部差异是什么echo *?下面发生了什么?

答案1

ls需要努力整齐地列出文件名列。它还需要信息来了解如何呈现名称(用颜色或以其他方式指示不同的文件类型),并可能包含与每个目录条目关联的元数据的详细信息。这是我的 Cygwin 安装的示例:

cd /bin
ls
[.exe                 cygpstoedit-0.dll       mpost.exe
__pycache__           cygptexenc-1.dll        msgtool.exe
a2ping                cygraqm-0.dll           msxlint.exe
a5toa4                cygraw_r-16.dll         mv.exe
acyclic.exe           cygraw-16.dll           named-rrchecker.exe
addftinfo.exe         cygreadline7.dll        namei.exe
...

不直接相关,但当您进行实验时,ls您会发现列宽将根据最长文件名的长度而变化。这要求ls在开始输出任何文件名之前读取并考虑每个文件名。较新版本ls还可能显示“奇怪”的文件名以及单引号内包含空格的文件名。 (就我个人而言,我通过设置禁用了此功能QUOTING_STYLE=literal。)

echo本身并没有什么聪明的地方,但是 shell 会将 扩展为*按字母数字排序的文件名列表,并将该列表作为单词直接传递给echo.这是同一个目录,显示为echo

cd /bin
echo *
[.exe __pycache__ a2ping a5toa4 acyclic.exe addftinfo.exe addr2line.exe adhocfilelist afm2pl.exe afm2tfm.exe aleph.exe allcm allec allneeded animate apropos ar.exe arara arch.exe arlatex as.exe ascii.exe ash.exe autosp.exe awk axohelp.exe b2sum.exe banner.exe base32.exe...

您所看到的是,shell 提取文件名列表的速度明显快于ls创建整洁列表所执行的处理速度。 GNUls允许您使用 禁用显示处理ls -f。 (看看man ls它实际上做了什么。)

答案2

在执行命令之前,当前 shell 将替换为以空格分隔的*文件列表(假设从文件中读取) 。.echo

echo将把空格之间的每个字符序列作为单词处理,并输出用空格字符分隔的单词列表。这意味着将处理多个空格只有一个:单词分隔符。因此,文件的确切名称可能会在输出中更改:当文件名称中存在空格或特殊字符时。

ls正在访问.文件,该文件包含当前目录中的文件列表,并打印以<new line>字符分隔的文件名。

相关内容