Как я могу колонировать любой неколонированный ввод, как это 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
(Я использую только список файлов здесь для генерации того же вывода, что и в примере, я ищу такое решение для колонизации других вещей в конце.)
Как я могу обработать любой вывод с переменной шириной кол?
column -c
_n
-x`, но размещать выходные данные как можно меньше столбцов экрана, а не заполнять указанную ширину». Это правильно?ls
управляет этим). Может быть, мы найдем решение, если мы посмотрим на исходный код исходного кодаls
команды в coreutilsОтветы:
Спасибо @ rubo77 за вопрос, это отличное упражнение. Для меня это были ошибки «один на один», а английский - это «крутой материал» для испорченного ритма: он получился веселым, быстрым, хотя сам алгоритм здесь довольно прост.
[окончательное редактирование: перенесено на https://github.com/jthill/columnate/blob/master/columnate , исправлена ошибка, реализована основная строка. ]
источник
time ls | sort | columnate COLUMNS=$COLUMNS
Нечто близкое к выводу
ls
:источник