我想为 KSH 创建一个名为 dir
的别名,它将仅显示包含许多文件和目录的杂乱目录中的子目录。
我可以输出目录的单列列表,但在将单列列表转换为多列时遇到问题。
我希望它根据最长字符串的长度和终端窗口的宽度自动确定要使用的列数,就像 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 列,如果终端窗口相当窄(即 $COLUMNS 小到 50),那么长目录名称将在下一列的开头被截断。
有人可以回答为什么 column
没有将列表输出到列中,或者有人使用其他工具(例如 sed、awk、perl)有更好的解决方案吗?
感谢您的帮助!
最佳答案
真的,你只需要
alias dir='ls -d */ .*/'
结尾的斜杠指示 ksh 仅在 glob 扩展中包含目录。您还可以了解如何将 ls
格式化为列。
您的问题的答案是您为 column
使用了错误的选项:
ls -1d */ .*/ | column -c $(tput cols)
column -t
漂亮地打印输出,来自
1
a b
foobar baz
进入
1
a b
foobar baz
关于linux - 创建 Linux 别名以仅列出目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34534355/