Цветной вывод из fd, переданный в column, не выровнен правильно.

Вопрос или проблема

Когда я выполняю команду “fd –color always –max-depth=1 | column”, вывод неправильно выровнен, но выровнен, когда --color установлен в --color never.

Для справки, fd --color never --max-depth=1 | column выводит

test-folder/    test12.txt  test16.txt  test2.txt   test5.txt   test9.txt
test1.txt   test13.txt  test17.txt  test20.txt  test6.txt
test10.txt  test14.txt  test18.txt  test3.txt   test7.txt
test11.txt  test15.txt  test19.txt  test4.txt   test8.txt

(Он правильно выровнен в моем терминале, не уверен, почему копирование и вставка сюда делают его невыравненным?)

А fd --color always --max-depth=1 | column выводит

test-folder/    test19.txt
test1.txt           test2.txt
test10.txt          test20.txt
test11.txt          test3.txt
test12.txt          test4.txt
test13.txt          test5.txt
test14.txt          test6.txt
test15.txt          test7.txt
test16.txt          test8.txt
test17.txt          test9.txt
test18.txt

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

Согласно https://unix.stackexchange.com/a/769660, версия 2.40 столбца должна правильно обрабатывать цветовые коды, моя версия столбца из справки:

util-linux 2.40.2 2024-07-04 COLUMN(1)

Какой простой способ получить вывод от fd в виде нескольких колонок? Мой случай использования таков, что я предпочел бы использовать fd вместо ls каждый раз, когда я хочу посмотреть файлы в директории.

Спасибо

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что вывод команды fd (Find Duplicate Files) с параметром --color always содержит цветовые коды ANSI, которые не корректно обрабатываются при передаче в команду column. Эти коды влияют на выравнивание столбцов, что приводит к разной длине строк и, как следствие, к их неправильному отображению.

Когда вы используете fd --color never --max-depth=1 | column, вывод правильно выравнен, так как в нем отсутствуют цветовые коды. Однако при использовании fd --color always, эти цветовые коды вставляются в текст, тем самым нарушая форматирование.

Проблема в деталях

Основная причина проблемы заключается в следующем:

  1. Цветовые коды ANSI занимают место в выводе, но не влияют на визуальное представление текста. Это означает, что для терминала длина строки с учетом цветового кода может отличаться от фактической длины строки видимого текста.
  2. Команда column не распознает цветовые коды и обрабатывает их как часть текста, что приводит к неправильному выравниванию столбцов.

Способы решения проблемы

Для обхода этой проблемы и достижения желаемого формата вывода можно использовать несколько подходов.

1. Удаление цветовых кодов

Можно использовать утилиту sed, чтобы удалить цветовые коды из вывода команды fd перед передачей его в column. Например:

fd --color always --max-depth=1 | sed 's/\x1B\[[0-9;]*m//g' | column

В этом случае sed удалит все ANSI escape-коды, и column сможет корректно выровнять вывод.

2. Использование ls с параметрами

Если fd не является строго необходимой утилитой, можно использовать команду ls с параметрами:

ls --color=always -1 | column

Этот вариант также позволит получить цветной вывод, но с правильным выравниванием.

3. Использование awk для форматирования вывода

Если вам важно сохранить цветное форматирование, можно воспользоваться awk для форматирования вывода. Например:

fd --color always --max-depth=1 | awk '{ printf "%-20s", $0; if (NR % 5 == 0) print ""; }'

Этот подход позволит вам установить ширину каждого столбца и управлять его форматированием, но нужно помнить, что цветовые коды могут все равно влиять на вывод.

Заключение

Если вам нужно добиться корректного выравнивания при использовании fd, лучше всего удалить цветовые коды с помощью sed перед передачей вывода команде column. Это обеспечит вам чистый, читаемый и правильно выровненный вывод. Вы также можете ознакомиться с параметрами ls или альтернативными утилитами, если использование fd не является обязательным.

Если у вас возникли дополнительные вопросы или вам нужно больше информации, не стесняйтесь задавать!

Оцените материал
Добавить комментарий

Капча загружается...