如何像这样对任何未分栏的输入进行分栏ls
?
ls
正在创建每行具有最小宽度的优化表,例如:
ls
2 dsao file with space with
5 e g wsdl-rubo-6cb0f1a9086e80c
d file leading space
但是如果我将输出输入column
(例如一行中的每个文件),它会将每一行填充相同的宽度,因此它适合屏幕宽度:
for i in *; do echo "$i"; done | column
2 file with space
5 g
d leading space
dsao with
e wsdl-rubo-6cb0f1a9086e80c
file
(我在这里仅使用文件列表来生成与示例相同的输出,我正在寻找这样的解决方案来最终列出其他内容。)
如何使用可变的列宽度对任何输出进行列列?
答案1
感谢@rubo77 提出这个问题,这是一个很好的练习。对我来说,这对于差一点的错误就像英语是艰难的东西对于糟糕的节奏一样:它变得有趣、快速,尽管这里的算法本身非常简单。
[最终编辑:移至https://github.com/jthill/columnate/blob/master/columnate,修复了错误,实现了行优先。 ]
答案2
接近输出的东西ls
:
for i in *; do echo -en "${i}\t"; done; echo
答案3
这不使用每行的最小宽度,就像@jthill上面的解决方案一样,但还需要注意的是:
我安装了autogen
包含完全解决此问题的homebrew
命令:columns
- 安装自制程序:https://brew.sh/
brew install autogen
测试用
spit() { for i ; do echo "$i"; done; }
spit 1 2222222222222222 3 4 5 6 7777777777777777 8 $(seq 10 30) | columns
输出:
1 2222222222222222 3 4
5 6 7777777777777777 8
10 11 12 13
14 15 16 17
18 19 20 21
22 23 24 25
26 27 28 29
注意:也许 apt 包也足够了:
apt install autogen
答案4
您可以创建临时文件夹并为未分栏输入的每个字符串项创建空文件,然后用于ls
分栏输出。
例子:
mkdir -p /tmp/col
IFS=''
echo "something_very_long-something_very_long-something_very_long
output with space
space-at-beginning
3
4
5
6
7
8
9"|while read; do
touch /tmp/col/"$REPLY"
done
cd /tmp/col/
ls
rm /tmp/col/*
输出:
3 7 something_very_long-something_very_long-something_very_long
4 8 ' space-at-beginning'
5 9
6 'output with space'