Можно ли использовать ls -l для разделения полей с помощью табуляций, а не пробелов, чтобы сделать вывод полезным в электронной таблице?

10

Как можно ls -lизменить выходные данные для разделения полей с помощью табуляции вместо пробелов? Я хочу вставить вывод в электронную таблицу; заполнение с переменным количеством пробелов затрудняет это. Проиллюстрировать:

корень drwxr-xr-x 2 корень 4096 сен 26 11:43 wpa_supplicant
-rw-r ----- 1 root dialout 66 сент. 26 11:43 wvdial.conf
drwxr-xr-x 9 корень корень 4096 8 октября 08:21 X11
drwxr-xr-x 12 root root 4096 18 февраля 23:31 xdg
drwxr-xr-x 2 root root 4096 31 января 06:11 xml
drwxr-xr-x 2 root root 4096 22 ноября, 07:26 xul-ext
-rw-r - r-- 1 корневой корень 349 13 января 2012 г. zsh_command_not_found

В отрывке из ls -l /etcпоказанного выше строки 1, 2 и 3 имеют одну цифру в столбце 2, тогда как строка 4 имеет две цифры. Это означает, что выравнивание достигается использованием двух пробелов для разделения столбцов 1 и 2 в строках 1-3, но только одним пробелом в ряду 4.


источник

Ответы:

3

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

#! / Бен / Баш

SAVEIFS = $ IFS
IFS = $ (echo -en "\ n \ b")
для файла в $ (лс)
делать
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $ файл
    mod_epoch = $ (stat --format = "% Y" $ file)
    mod_month = $ (дата -d @ $ mod_epoch + "% b")
    mod_day = $ (date -d @ $ mod_epoch + "% d")
    mod_time = $ (дата -d @ $ mod_epoch + "% H:% M")
    файл printf "% s \ t% s \ t% s \ t% s \ n" $ mod_month $ mod_day $ mod_time $
сделанный
IFS = $ SAVEIFS
  • Сохраните это в файл, скажем ls_tab.sh
  • Сделайте его исполняемым:
chmod + x ls_tab.sh
  • Запустить его:
./ls_tab.sh

Примечание: это может быть сделано путем синтаксического анализа выходных данных ls, однако причина, почему это не должно быть сделано, приведена здесь .

зеленый
источник
1
Если цель состоит в томls , чтобы узнать, что говорит , то разбор этого результата - это хорошо. Это редко является целью. Возможно, это здесь. Я думаю, что метод, который вы использовали, довольно хорош (любой метод будет давать нежелательные результаты при определенном наборе потребностей)! Тем не менее, возможно, разбор lsможет быть лучше. Рассмотрим случай имени файла, в котором есть символ табуляции. ls -lзаменяет вкладку ?символом. Ваш сценарий сохраняет символ табуляции, который создает дополнительные столбцы, если его выходные данные интерпретируются как разделенные табуляцией и используются для создания электронной таблицы. Это плохо ухудшается, если в имени файла есть новая строка.
Элия ​​Каган
1
Правда. Но обычно файлы не имеют \nили \tв их именах. Если они это сделают, то анализ вывода lsс помощью простых команд bash будет более сложным, но может быть достигнут. Я могу обновить ответ, если ОП хочет обрабатывать такие случаи.
зеленый
Это работает для меня, и длинные имена файлов с пробелами в них отображаются правильно. Мое использование довольно простое, и я надеюсь не иметь дело с файлами \nи \tих именами.
1
Отлично. Для электронной таблицы Windows используйте printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $fileи для перенаправления выходного файла как ./ls_tab.sh > listing.txt.
Федир РИХТИК
6

Пытаться:

ls -l | awk -v OFS="\t" '$1=$1'

Или, если ваши имена файлов имеют пробелы:

ls -l | awk '{print $1,"\t",$2,"\t",$3,"\t",$4,"\t",$5,"\t",$6,"\t",$7,"\t",$8,"\t",$9,$10,$11,$12,$13,$14,$15;}'
philshem
источник
+1. Работает отлично. Такого рода вещи - именно то awk, для чего. Умный!
tgies
К сожалению, это не работает правильно для имен файлов, которые содержат пробелы. Он также заменяет их вкладками. Хотя это проще и работает быстрее, чем основанное на сценариях решение green7 , это приведет к неправильному выводу значительную часть времени и не будет иметь никаких преимуществ по сравнению с методом Адитьи . Можно ли изменить это так, чтобы пробелы больше не интерпретировались как входные разделители после 9-го столбца?
Элия ​​Каган,
1
пожалуйста, смотрите обновление
philshem
@ psny18 Обновленный способ еще более испорчен. Он обрезает все, кроме первого слова каждого имени файла. Простое написание $9не меняет того факта, что вы awkвсегда интерпретируете пробелы как указание на разрыв между столбцами. $9захватывает только первое слово в этой позиции, и, поскольку другие слова считаются отдельными столбцами с более высокими номерами, они вообще никогда не печатаются.
Элия ​​Каган,
Жаль, что имена файлов не рассматриваются как один столбец, даже если в них есть пробелы.
1

Нам даже не нужно конвертировать вывод как Tab Delimited. Пространство между столбцами достаточно просто.

Запустите вашу ls -lкоманду в терминале, как обычно, и скопируйте содержимое, которое вы хотите вставить в электронную таблицу.

терминальная команда

Затем откройте программу электронных таблиц (в моем случае LibreOffice Calc) и нажмите Ctrl+, Vчтобы вставить содержимое буфера обмена.

Откроется Мастер импорта текста. Убедитесь, что вы поставили галочку рядом Spaceи нажмите Ok. Вы можете посмотреть предварительный просмотр в нижней панели.

Импорт текста Libo

Адитья
источник
1
Это не сработает, если в именах файлов есть пробелы
зеленый
@ green7: Ах .. Не понял этого! :-)
Адитья
Не только имена файлов, но и количество символов в столбцах. Заполнение там и везде вызывает проблемы, если в качестве разделителя выбрано «пробел». Я отредактирую вопрос, чтобы проиллюстрировать это.
0

Python хорош для этого:

# python
import os

os.system( 'ls -lR --time-style=full-iso /home/jw > ls_dump.txt')

folder = ''

for line in open('ls_dump.txt', 'r'):

    inrec = line.split()

    if inrec == []:
        continue

    if inrec[0].startswith('total'):
        continue

    if inrec[0].endswith(':'):
        folder = inrec[0].replace(':','')
        continue

    outline = folder + '\t' + '\t'.join(inrec[0:8]) +'\t'+ ' '.join(inrec[8:]) 

    print( outline )
JWest
источник