创建 Linux 别名以仅列出目录

Creating Linux Alias to list only Directories

我想为 KSH 创建一个名为 dir 的别名,它将仅显示包含许多文件和目录的杂乱目录中的子目录。

我可以输出目录的单列列表,但我在将单列列表转换为多列时遇到问题。

我希望它根据最长字符串的长度和终端的宽度自动确定要使用的列数 window 与 ls 命令自动创建的方式相同标签栏。

假设我在终端输入以下命令,得到当前目录中所有目录的列表:

ls -1Fa | grep /

当我将此输出通过管道传输到 column -t 时,它似乎没有任何效果...我在单列中获得了 54 个目录的列表。我还尝试了其他管道到 column -t -s $'\t'column -t -s $'\n' 的帖子中的常见建议,但它总是导致单个列表输出。我查看了手册页并尝试了所有选项,但我无法让它产生类似于 ls.

的输出

我还尝试通过以下方式将输出通过管道传递给 pr:

alias dir="ls -1Fa | grep / | pr -T -w $COLUMNS -6"

不幸的是,这将始终输出 6 列,如果终端 window 相当瘦(即 $COLUMNS 小到 50),那么长目录名称将在下一列的开头被截断。

有人可以回答为什么 column 没有将列表输出到列中,或者有人使用其他工具(例如 sed、awk、perl)有更好的解决方案吗?

感谢您的帮助!

真的,你只需要

alias dir='ls -d */ .*/'

结尾的斜杠指示 ksh 仅在 glob 扩展中包含目录。您将了解 piggy-back 如何 ls 格式化为列。

您的问题的答案是您为 column 使用了错误的选项:

ls -1d */ .*/ | column -c $(tput cols) 

column -t pretty-prints 输出,来自

1
a b
foobar baz

进入

1
a       b
foobar  baz

column man page