LINUX.ORG.RU

Задать количество колонок

 ,


0

1

Как можно задать количество колонок (9) в выводе

ls -al | column -t

?
Проблема в том, что для некоторых строк с пробелами в именах создаются лишние колонки.
Как ограничить количество создаваемых столбцов?

★★★★★

Тебе не количество столбцов надо ограничивать, а выбрать символ разделения колонок, который редко/не встречается в именах файлов, например \t, и сообщить его ls и column.

legolegs ★★★★★ ()
Ответ на: комментарий от legolegs

не встречается

хм я вот тоже думал \r с \n то уж мне не попадётся в имени файла. с тех пор использую \0 в качестве разделителя везде где можно, мне повезло и я был предусмотрительный, а кто-то ведь попадётся. вообще я так половину кед сломал когда решил посмотреть кто ещё подвержен

anonymous ()

Не совсем понятно поставлен вопрос. В выводе ls колонки после 9 нужны или нет? Если нужны, но при этом нужно иметь одинаковое количество колонок, то:

total 8388664
-rw-r--r--   1 root root          0 Jan  7 14:30 '123 a b c'
lrwxrwxrwx   1 root root          7 Dec  6 17:19  bin -> usr/bin
drwxr-xr-x   4 root root       4096 Jan  4 14:48  boot
drwxr-xr-x  21 root root       3720 Jan  7 11:12  dev
drwxr-xr-x  85 root root       4096 Jan  6 22:32  etc
drwxr-xr-x   3 root root       4096 Jan  1 12:33  home
lrwxrwxrwx   1 root root          7 Dec  6 17:19  lib -> usr/lib
lrwxrwxrwx   1 root root          7 Dec  6 17:19  lib64 -> usr/lib
drwx------   2 root root      16384 Jan  1 12:19  lost+found
drwxr-xr-x   2 root root       4096 Dec  6 17:19  mnt
drwxr-xr-x   2 root root       4096 Dec  6 17:19  opt
dr-xr-xr-x 218 root root          0 Jan  7 11:12  proc
drwxr-x---  14 root root       4096 Jan  6 22:30  root
drwxr-xr-x  21 root root        600 Jan  7 11:23  run
lrwxrwxrwx   1 root root          7 Dec  6 17:19  sbin -> usr/bin
drwxr-xr-x   5 root root       4096 Jan  1 13:13  srv
-rw-------   1 root root 8589934592 Jan  1 12:33  swapfile
dr-xr-xr-x  13 root root          0 Jan  7 11:12  sys
drwxrwxrwt  15 root root        380 Jan  7 13:37  tmp
drwxr-xr-x   9 root root       4096 Jan  6 21:46  usr
drwxr-xr-x  12 root root       4096 Jan  6 22:32  var

ls -Al / | sed -r '1d; s/ +/_/9g'
-rw-r--r--   1 root root          0 Jan  7 14:30 123_a_b_c
lrwxrwxrwx   1 root root          7 Dec  6 17:19 bin_->_usr/bin
drwxr-xr-x   4 root root       4096 Jan  4 14:48 boot
drwxr-xr-x  21 root root       3720 Jan  7 11:12 dev
drwxr-xr-x  85 root root       4096 Jan  6 22:32 etc
drwxr-xr-x   3 root root       4096 Jan  1 12:33 home
lrwxrwxrwx   1 root root          7 Dec  6 17:19 lib_->_usr/lib
lrwxrwxrwx   1 root root          7 Dec  6 17:19 lib64_->_usr/lib
drwx------   2 root root      16384 Jan  1 12:19 lost+found
drwxr-xr-x   2 root root       4096 Dec  6 17:19 mnt
drwxr-xr-x   2 root root       4096 Dec  6 17:19 opt
dr-xr-xr-x 219 root root          0 Jan  7 11:12 proc
drwxr-x---  14 root root       4096 Jan  6 22:30 root
drwxr-xr-x  21 root root        600 Jan  7 11:23 run
lrwxrwxrwx   1 root root          7 Dec  6 17:19 sbin_->_usr/bin
drwxr-xr-x   5 root root       4096 Jan  1 13:13 srv
-rw-------   1 root root 8589934592 Jan  1 12:33 swapfile
dr-xr-xr-x  13 root root          0 Jan  7 11:12 sys
drwxrwxrwt  15 root root        380 Jan  7 13:37 tmp
drwxr-xr-x   9 root root       4096 Jan  6 21:46 usr
drwxr-xr-x  12 root root       4096 Jan  6 22:32 var

Заменяет все сепараторы пробелы после девятой колонки на нижнее подчеркивание. Получается фиксировано по 9 колонок на каждую строку.

Yorween ()
Ответ на: комментарий от Yorween

sed -r '1d; s/ +/_/9g'

можно как-нибудь попробовать заменить пробелы в имени на /, потом выполнить column -t, потом обратно преобразовать слэши в пробелы.
но не знаю как заменить пробелы только в имени, они же в других колонках тоже есть

teod0r ★★★★★ ()
Ответ на: комментарий от teod0r

а если в имени файла идёт несколько пробелов подряд

Вообще это моветон. Сохранять в результате фиксированное количество столбцов при этом нужно или нет? От этого зависит решение.

Yorween ()
Ответ на: комментарий от teod0r

Раз ты все это делаешь в сложном скрипте (не однострочник), то напиши на том же баше свой column, дели на заданное (9) кол-во полей, вычисляй макс. длину каждого поля и формируй формат-строку для printf

futurama ★★ ()
Ответ на: комментарий от teod0r

Накостылял, но с 2 столбцами. Судя по твоему пояснению, тебе и не нужны все столбцы. Форматируется только последний по ширине. А раз про выравнивание не было речи, то можно и так. Проблема может быть только если в конце наименования файла есть пробел.

ls -QAl / | sed -r '1d; s/"/ /2g; s/ $//' | awk -F"\"" '{gsub(" ","/",$2); print $1,$2}'

А вообще http://mywiki.wooledge.org/ParsingLs

Yorween ()
Ответ на: комментарий от teod0r

Не понятно.

У тебя скрипт типа такого?

for blablablabla....; do
    ls -alQ "$MYFILE"
done

Ну так перепиши его на один вызов ls, чтобы он сам всё выровнял, типа так

for blablablabla....; do
    printf "%s\0" "$MYFILE"
done | xargs --no-run-if-empty -0 ls -alQ
legolegs ★★★★★ ()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

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

teod0r ★★★★★ ()
Ответ на: комментарий от teod0r

Не распарсил. Кто «они»? Рептилоиды?

По мне так вывод ls -l достаточно приятен для глаза (надеюсь ты его потом не парсишь?)

Функции умеет пускать GNU parallel, я на него постепенно перехожу, классная штука даже, когда параллельность не нужна.

legolegs ★★★★★ ()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Не распарсил. Кто «они»? Рептилоиды?

отписавшиеся в треде.

По мне так вывод ls -l достаточно приятен для глаза (надеюсь ты его потом не парсишь?)

не парсю. попробуй натрави ls на 2 файла (обычный и директорию), чтоб у них разная длина размера файла была — вывод будет невыровнен

teod0r ★★★★★ ()
Ответ на: комментарий от teod0r

Да, действительно, файлы из каждой директории ls выравнивает отдельно. Тогда можно так:

ls -l .ssh/authorized_keys .bashrc
-rw------- 1 legolegs legolegs 1012 сен 25  2017 .bashrc
-rw-r----- 1 legolegs legolegs 2612 янв  7 11:38 .ssh/authorized_keys

Я не предлагаю решение с columns потому, что найдутся файлы с пробелами/табами/переводами строк/эмоджи/демоническими письменами за гранью безумия, которые форматирование сломают (*).

Я не предлагаю самописное решение, т.к. это сложно и в итоге получится реализация gnu ls на bash/sed/awk/python.

(*) Если задать ls свой формат, где разделять строки \0 и колонки / то можно объяснить column что делать.

legolegs ★★★★★ ()
Последнее исправление: legolegs (всего исправлений: 1)