ls:只有一个匹配模式时显示目录名称

ls:只有一个匹配模式时显示目录名称

当用于ls显示与某个模式匹配的文件时,如果有多个匹配,则显示目录名称及其内容,但如果只有一个匹配,则省略目录名称。这是一个例子:

example % ls
bar     barbados    foo

example % ls b*
bar:
1   2

barbados:
1   2

example % ls f*
1   2

在示例中,请求以b*匹配两个目录开头的所有文件,输出显示两个目录的名称及其内容。

当我请求f*输出时,显示单个匹配目录的内容,但省略目录名称。

如何配置ls在只匹配单个目录的情况下显示匹配目录的名称?

答案1

可能的解决方法可能是包装函数:

dls() {
    if [ "$#" -eq 1 ] && [ -d "$1" ]; then
        printf '%s:\n' "$1"
    fi
    ls -- "$@"
}
  • 上面的函数不接受任何选项作为参数传递
  • 它只是检查是否:
    1. 只有一个参数
    2. 参数是一个目录

如果这两个条件成立,则在列出目录内容之前打印目录名称。


% dls f*
foo:
1   2

在某些printf实现中,您可以将目录名称替换为 ,%s以与最新版本的 GNU在包含空格或其他特殊字符时%q类似的方式引用目录名称。ls

答案2

使用您的示例,当您执行 时ls b*,shell 会将 展开b*bar barbados,因此您实际上运行了ls bar barbados。当ls有多个参数时,如果其中任何一个是目录,它将打印名称,后跟目录中的文件列表。

当您执行时ls f*,shell 会将 展开f*foo,因此您实际上运行了ls foo。当ls只有一个参数时,如果该参数是目录,则打印目录中的文件列表(不带目录名称)。

没有什么我所说的“好”方法可以做ls你想做的事(至少据我所知,其他人可能知道得更好)。一种“不太好的”方法是包含一个您知道永远不会存在的附加参数,然后过滤与该不存在的文件相关的错误输出。我会记录下来,解析 的输出ls是一个坏主意,但我会给你这个以防万一它有帮助:

$ function dls() {
    if [[ $# -eq 0 ]]; then
        ls
    else
        ls ${@} this-file-does-not-exist-anywhere 2> >(grep -v this-file-does-not-exist-anywhere)
    fi
}

$ dls
foo

$ dls f*
foo:
1  2

这样做可能会产生意想不到的后果(例如,您可能无法像通常那样重定向标准错误消息)。

答案3

使用-al大多数人每次都会使用的参数。ls然后不会这样做,直到您在目录名中添加尾部斜杠。另一个参数是-d,那么它就不会以任何方式下降。

如果您希望它永久存在,请将以下内容放入.bashrc您的主目录中:

alias lsd='ls -d' ;

lsd您可以在以后使用该命令。

相关内容