当用于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 -- "$@"
}
- 上面的函数不接受任何选项作为参数传递
- 它只是检查是否:
- 只有一个参数
- 参数是一个目录
如果这两个条件成立,则在列出目录内容之前打印目录名称。
% 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
您可以在以后使用该命令。