我想为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)有更好的解决方案吗?
感谢您的帮助!
答案 0 :(得分:2)
真的,你需要的只是
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