只列出指定目录下的子目录名
在 ls 命令中只列出子目录名
在 Linux 中,ls
命令默认会列出所给目录下的所有文件名,包含子目录名。如果只想列出当前目录下的子目录名,能够应用 ls -d */
命令。
具体举例说明如下:
$ ls
test_dir test_text
$ ls -d */
test_dir/
$ ls -d *
test_dir test_text
在这个例子中,当前目录下有一个 test_dir 子目录、和一个 test_text 文本文件。
能够看到,ls -d */
命令只列出 test_dir 子目录名,且目录名以 /
结尾。
而 ls -d *
命令还是列出了当前目录下的所有文件名。
前面会阐明这两个命令的区别。
查看 info ls 对 -d
选项的阐明如下:
-d, –directory
List just the names of directories, as with other types of files, rather than listing their contents.
即,ls -d
选项只列出所给参数本身的名称。如果参数中蕴含目录名,只列出该目录名,不再列出该目录下的所有文件名。如果参数中蕴含文件名,则列出该文件名。
留神 :ls
命令的参数是目录名时,默认是列出该目录下的文件名,包含子目录名。如果没有任何参数,默认应用‘.’这个参数,也就是列出当前目录下的文件名。
而 ls -d
选项扭转了这个行为,不再获取所给目录下的文件信息,只列出所给的目录名。
具体举例说明如下:
$ ls
test_dir test_text
$ ls -d
.
$ ls test_dir
$ ls -d test_dir
test_dir
跟下面例子一样,当前目录下有一个 test_dir 子目录、和一个 test_text 文本文件。
ls
命令不提供任何参数时,相当于 ls .
命令,列出当前目录下的文件信息。
ls -d
命令只打印了一个 .
,对应当前目录。
ls -d
相当于 ls -d .
命令,而 -d
选项指定列出所给目录名,不列出目录下的文件,所以打印出一个 .
。
ls test_dir
目录打印为空,因为 test_dir 是一个空目录,该目录下没有文件。
ls -d test_dir
目录打印了 test_dir,也就是所给的 test_dir 目录名。
基于下面阐明,关上 bash 的调试信息后,能够看到 ls -d */
命令和 ls -d *
命令的区别如下:
$ set -x
$ ls -d */
+ ls --color=auto -d test_dir/
test_dir/
$ ls -d *
+ ls --color=auto -d test_dir test_text
test_dir test_text
$ set +x
能够看到,*/
扩大之后的后果是 test_dir/,只有子目录名,没有文本文件名。那么 ls -d test_dir/
只列出了这个目录名。
而 *
扩大之后的后果是 test_dir test_text,蕴含子目录名和文本文件名。那么 ls -d test_dir test_text
会列出所给的子目录名和文件文件名。
应用星号 * 通配符来获取子目录名
下面两个命令最大的区别在于 */
和 *
的路径名扩大后果不同。
查看 man bash 的 Pathname Expansion 大节,对此阐明如下:
If followed by a /, two adjacent *s will match only directories and subdirectories.
即,当星号 *
通配符前面跟着 /
字符时,路径名扩大后果只有目录名和子目录名。
如果只是想获取当前目录下的子目录名,间接为赋值为 */
即可,不要用引号括起来。
具体举例如下:
$ subdirs=*/
$ echo $subdirs
test_dir/
能够看到,subdirs=*/
语句会把 subdirs 变量赋值为当前目录下的子目录名,目录名会以 /
结尾。
当在 shell 脚本中应用时,因为执行 shell 脚本的工作目录可能不固定,能够通过绝对路径来寻址。
具体举例如下:
$ subdirs=/home/sample/*/
$ echo $subdirs
/home/sample/test_dir/
应用 ls -1 逐行列出文件名
一般来说,ls 命令会在一行中打印多个文件名。如果想要每行只打印一个文件名,能够应用 -1
选项。留神,这里是数字 1,而不是字母 l。
查看 man ls 对 -1 选项阐明如下:
-1
list one file per line. Avoid ‘n’ with -q or -b
即,-1 选项会让每行只打印一个文件名。