这是一个bash bug吗? (用ls列出目录)

时间:2017-12-05 10:44:57

标签: bash ls

如果我想列出以下目录中的所有文件和目录:

[root@centos2 dir1]# tree
.
+-- dir2
    +-- coucou.txt

1 directory, 1 file

为什么dir2没有显示在下面?仅显示文件。

[root@centos2 dir1]# ls -l *
total 0
-rwxr--r-- 1 root root 0 Dec  2 18:20 coucou.txt

如果我复制目录和列表,则会显示它们:

[root@centos2 dir1]# cp -r dir2/ dir3
[root@centos2 dir1]# tree
.
+-- dir2
¦   +-- coucou.txt
+-- dir3
    +-- coucou.txt

2 directories, 2 files

[root@centos2 dir1]# ls -l *
dir2:
total 0
-rwxr--r-- 1 root root 0 Dec  2 18:20 coucou.txt

dir3:
total 0
-rwxr--r-- 1 root root 0 Dec  5 11:34 coucou.txt

2 个答案:

答案 0 :(得分:5)

不,这不是一个错误;这是shell扩展*以匹配所有内容的预期行为。 *被参数列表替换,每个匹配路径一个, 命令运行之前。

在您的第一个示例ls -l *中,shell会将*扩展为dir2,因此您的命令为ls -l dir2ls然后只列出该目录的内容,以便获取文件coucou.txt

在第二个示例中,*扩展为两个参数dir2dir3。在这种情况下,ls -l的行为是分别列出每个目录的内容。

答案 1 :(得分:2)

如果您使用类似ls -l *的命令,就像您正在为当前目录中的每个元素编写命令,将*更改为元素的名称。当你使用命令ls并且参数是一个目录时,它会列出里面的元素,而不是目录本身。

我认为您正在寻找递归ls选项,即-R

[root@centos2 dir1]#ls -lR
.:
total 8
drwxr-xr-x 2 root root 4096 Dec  5 11:41 dir2
drwxr-xr-x 2 root root 4096 Dec  5 11:41 dir3

./dir2:
total 0
-rw-r--r-- 1 root root 0 Dec  5 11:41 cocou.txt

./dir3:
total 0
-rw-r--r-- 1 root root 0 Dec  5 11:41 cocou.txt