Вопрос или проблема
Когда я выполняю команду “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
, эти цветовые коды вставляются в текст, тем самым нарушая форматирование.
Проблема в деталях
Основная причина проблемы заключается в следующем:
- Цветовые коды ANSI занимают место в выводе, но не влияют на визуальное представление текста. Это означает, что для терминала длина строки с учетом цветового кода может отличаться от фактической длины строки видимого текста.
- Команда
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
не является обязательным.
Если у вас возникли дополнительные вопросы или вам нужно больше информации, не стесняйтесь задавать!