只列出指定目录下的子目录名。给定目录中的所有文件名,包括子目录名。如果只想列出当前目录下的子目录名,可以使用ls-d*/命令。具体示例如下:$lstest_dirtest_text$ls-d*/test_dir/$ls-d*test_dirtest_text本例中,当前目录下有一个test_dir子目录和一个test_text文本文件。可以看到,ls-d*/命令只列出了test_dir子目录名,目录名以/结尾。ls-d*命令仍然列出当前目录中的所有文件名。这两个命令之间的区别将在后面解释。检查信息ls以获取-d选项的说明,如下所示:-d,--directoryList仅列出目录名称,与其他类型的文件一样,而不是列出它们的内容。也就是说,ls-d选项仅列出给定参数本身的名称。如果参数中包含目录名,则只列出目录名,不列出目录下的所有文件名。如果参数中包含文件名,请列出文件名。注意:当ls命令的参数为目录名时,默认列出目录下的文件名,包括子目录名。如果没有参数,'.'默认使用参数,即列出当前目录下的文件名。ls-d选项改变了这种行为,不再获取给定目录中的文件信息,而只列出给定的目录名。具体例子如下:$lstest_dirtest_text$ls-d.$lstest_dir$ls-dtest_dirtest_dir同上例,当前目录下有一个test_dir子目录和一个test_text文本文件。当ls命令不提供任何参数时,它等同于ls。命令列出当前目录下的文件信息。ls-d命令只打印一个.,对应当前目录。ls-d等同于ls-d。命令,而-d选项指定列出给定的目录名称,而不是列出目录中的文件,因此.被打印出来。lstest_dir目录打印为空,因为test_dir是一个空目录,其下没有任何文件。ls-dtest_dirdirectory打印test_dir,这是test_dir的给定目录名称。根据以上描述,打开bash调试信息后,可以看到ls-d*/命令和ls-d*命令的区别如下:$set-x$ls-d*/+ls--color=auto-dtest_dir/test_dir/$ls-d*+ls--color=auto-dtest_dirtest_texttest_dirtest_text$set+x可以看到*/展开后的结果是test_dir/,只有子目录名,没有文本文件名。然后ls-dtest_dir/只列出这个目录名。*展开的结果是test_dirtest_text,里面包含子目录名和文本文件名。然后ls-dtest_dirtest_text将列出给定的子目录名称和文件名称。使用星号*通配符获取子目录名称。上面两个命令最大的区别就是*/和*的路径名扩展结果不同。参见manbash的PathnameExpansion部分,解释如下:如果后面跟一个/,两个相邻的*只会匹配目录和子目录。即当星号*通配符后跟/字符时,路径名扩展的结果只是目录名和子目录名。如果只想获取当前目录下的子目录名,可以直接赋值*/而不用引号括起来。具体例子如下:$subdirs=*/$echo$subdirstest_dir/可以看到subdirs=*/语句会将subdirs变量赋给当前目录下的子目录名,目录名以/结尾。在shell脚本中使用时,由于执行shell脚本的工作目录可能不固定,可以用绝对路径寻址。具体例子如下:$subdirs=/home/sample/*/$echo$subdirs/home/sample/test_dir/使用ls-1逐行列出文件名一般情况下,ls命令会打印多个文件名在一条线上。如果你想每行只打印一个文件名,你可以使用-1选项。注意这里的数字1,而不是字母l。请参阅manls的-1选项,如下所示:-1每行列出一个文件。避免使用-q或-b的'n'即,-1选项将每行只打印一个文件名。
