如果我想列出以下目录中的所有文件和目录:
[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
答案 0 :(得分:5)
不,这不是一个错误;这是shell扩展*
以匹配所有内容的预期行为。 *
被参数列表替换,每个匹配路径一个, 命令运行之前。
在您的第一个示例ls -l *
中,shell会将*
扩展为dir2
,因此您的命令为ls -l dir2
。 ls
然后只列出该目录的内容,以便获取文件coucou.txt
。
在第二个示例中,*
扩展为两个参数dir2
和dir3
。在这种情况下,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