为什么 'ls' 递归到文件夹中?

Why does 'ls' recurse into folders?

当我在其上使用通配符时,为什么 ls 总是递归到文件夹中(我宁愿它不这样做,而是只显示目录中以 [=13 开头的所有项目) =] 仅此而已)?

$ ls
boot/  etc/   lost+found/  mnt/  proc/  run/  srv/  tmp/  var/  init*  lib32@  libx32@ dev/  home/  media/ opt/  root/  snap/  sys/  usr/  bin@  lib@   lib64@  sbin@

/ $ ls m*
media:

mnt:
c/  d/  e/  wsl/

$ alias ls
alias ls='ls -FAh --color=auto --group-directories-first'

这个问题在这里跑题了,应该迁移到Unix & Linux or Super User;为 OP 的利益回答社区维基,但希望它被关闭)。


ls 不是递归。相反,它正在解析作为列出 media 目录内容的指令给出的命令行。


关于 UNIX 的一般理解很重要的一点是,命令不会解析它们自己的命令行——无论启动什么程序,它都会负责产生一个 C 字符串数组,用作它的命令行参数, 因此不能使用像 ls m* 这样的单个字符串。

因此 shell 将 ls m* 替换为数组 ["ls", "media"](当 mediam* 的唯一匹配项时)。

因为 ls 无法区分将 media 作为要列出的目录的名称,和将 media 作为扩展 glob 的结果,它采用前者,并列出该目录的内容。

Why does ls always recurse into folders when I use a wildcard on it

如果通配符匹配目录,则符合规范。
来自 The Open Group Base Specifications Issue 7, 2018 edition:

For each operand that names a file of type directory, ls shall write the names of files contained within the directory as well as any requested, associated information.

但是,您可以使用 -d 选项覆盖此默认行为:

Do not follow symbolic links named as operands unless the -H or -L options are specified. Do not treat directories differently than other types of files. The use of -d with -R or -f produces unspecified results.