有什么区别
ls /example or ls /example/
对比
ls -d /example/*
为什么它们给出(几乎)相同的输出?
答案1
在第一种情况下,你给予ls一个目录并要求显示其内容。
在第二种情况下,你已经给予ls直接显示内容(单个文件和子目录的列表),并要求准确显示这些项目,但不是其进一步的内容。
因此它们给出相同的输出,因为它们做几乎是同样的事情,只是前一种情况ls本身就决定了它需要显示什么内容,而在后一种情况下,您需要给它一个预先确定的列表。
負責有两种模式:当给定一个文件时,它只显示该文件;当给定一个目录时,它显示内容该目录(深度为一个级别)。
你/example
是一个目录,因此当你使用时ls /example
,ls将显示其内容。该-d
选项禁用此行为,并使ls 总是仅显示给定的项目,无论它是否是文件。
(比较:ls -l /etc
和ls -l -d /etc
)
但是当你使用 时ls -d /example/*
,你不是要求它显示目录——而是给它单个项目的列表显示。在运行命令之前,您的 shell 会扩展通配符,因此您实际运行的是ls -d /example/file1 /example/file2 /example/file3
。
答案2
当 的参数ls
是目录时,ls
进入目录并列出目录内容,除非使用 调用-d
。请记住,文件名扩展 ('file*') 是在调用 ls 之前在 shell 中完成的,因此您有:
dir
├── file1
└── subdir
└── file2
ls dir
列出内容dir
( 一行file1
, 一行subdir
)ls -d dir
仅列出dir
(一行)ls dir/*
扩展为ls dir/file1 dir/subdir
,因此扩展subdir
为列出其内容ls -d dir/*
扩展为ls dir/file1 dir/subdir
,但由于-d
subdir
没有扩展 且 仅列出file1
和subdir
(因此您获得与第一种情况相同的输出)。