Чи може ls -l зробити окремі поля з вкладками, а не пробілами, щоб зробити висновок корисним у таблиці?


10

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

drwxr-xr-x 2 корінь кореня 4096, 26 вересня 11:43 wpa_supplicant
-rw-r ----- 1 кореневий діалог 66 26 вересня 11:43 wvdial.conf
drwxr-xr-x 9 корінь кореня 4096 8 жовтня 08:21 X11
drwxr-xr-x 12 корінь кореня 4096 лютого 18 23:31 xdg
drwxr-xr-x 2 корінь кореня 4096 31 січня 06:11 xml
drwxr-xr-x 2 корінь кореня 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.

ls 

Відповіді:


3

Я зробив сценарій оболонки для того ж. Він піклується про випадки, коли у файлах файлів є пробіли або будь-які інші спеціальні символи.

#! / бін / баш

SAVEIFS = $ IFS
IFS = $ (відлуння -en "\ n \ b")
для файлу в $ (ls)
робити
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $ файл
    mod_epoch = $ (stat --format = "% Y" $ файл)
    mod_month = $ (дата -d @ $ mod_epoch + "% b")
    mod_day = $ (дата -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;}'

+1. Працює чудово. Така річ - саме те awk, для чого. Розумний!
tgies

На жаль, це не працює правильно для імен файлів, які містять пробіли. Він також замінює їх вкладками. Хоча це простіше і працює швидше, ніж сценарій на базі сценарію green7 , це призведе до великої кількості часу, що невірно виводиться, і не має переваг перед методом Aditya . Чи можна це змінити так, що пробіли після 9-го стовпця більше не інтерпретуються як вхідні деліметри?
Елія Каган

1
дивіться оновлення
philshem

@ psny18 Оновлений спосіб ще гірше порушений. Це відрізає все, крім першого слова кожного імені файлу. Просто написання $9не змінює той факт, що ви awkзавжди інтерпретуєте пробіли як вказівку на розрив між стовпцями. $9фіксує лише перше слово в цій позиції, а оскільки інші слова вважаються окремими стовпцями з більшою цифрою, вони взагалі ніколи не друкуються.
Елія Каган

Шкода, що назви файлів не розглядаються як один стовпець, навіть якщо в них є пробіли.

1

Нам навіть не потрібно конвертувати вихід у розділі Tab. Простір між стовпцями просто достатньо.

Запустіть свою 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 )
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.