Как мне разместить список элементов с минимальной шириной?

7

Как я могу колонировать любой неколонированный ввод, как это 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

(Я использую только список файлов здесь для генерации того же вывода, что и в примере, я ищу такое решение для колонизации других вещей в конце.)

Как я могу обработать любой вывод с переменной шириной кол?

rubo77
источник
Хорошо, альтернативное прочтение вашего запроса, если я правильно понимаю ваши комментарии, будет «разбивать входные данные, как это делает column -c_ n-x`, но размещать выходные данные как можно меньше столбцов экрана, а не заполнять указанную ширину». Это правильно?
до
да, почти: дополнительно должно быть получено как можно больше столбцов, которые умещаются на экране. (вроде lsуправляет этим). Может быть, мы найдем решение, если мы посмотрим на исходный код исходного кода lsкоманды в coreutils
rubo77

Ответы:

5

Спасибо @ rubo77 за вопрос, это отличное упражнение. Для меня это были ошибки «один на один», а английский - это «крутой материал» для испорченного ритма: он получился веселым, быстрым, хотя сам алгоритм здесь довольно прост.

[окончательное редактирование: перенесено на https://github.com/jthill/columnate/blob/master/columnate , исправлена ​​ошибка, реализована основная строка. ]

jthill
источник
также вы должны положить это на github. Если это быстрее, чем ls-algorythm, может быть, вы можете создать более быстрый ls-util?
rubo77
@ rubo77 Вам нужно передать ей переменную COLUMNS. см. комментарий «проверить с» в коде. И это 10x-20x наоборот, медленнее, в основном потому, что это awk против C.
Jthill
time ls | sort | columnate COLUMNS=$COLUMNS
до
Ты гений. Это должно быть опубликовано для каждого дистрибутива Linux
rubo77
да, спасибо, правда, но это слишком сильно. читать код, это почти грубой силой
Jthill
3

Нечто близкое к выводу ls:

for i in *; do echo -en "${i}\t"; done; echo
Раду Рэдяну
источник
хорошо, это только прыжок в строке, если входные строки меняются более чем на одну вкладку по ширине. Есть ли способ предотвратить обрыв вывода на правой стороне окна?
rubo77