为什么 '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"]
(当 media
是 m*
的唯一匹配项时)。
因为 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.
当我在其上使用通配符时,为什么 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"]
(当 media
是 m*
的唯一匹配项时)。
因为 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.