Czy można zrobić ls -l do oddzielania pól tabulatorami zamiast spacji, aby dane wyjściowe były przydatne w arkuszu kalkulacyjnym?


10

Jak ls -lzmodyfikować dane wyjściowe w celu oddzielenia pól za pomocą tabulatorów zamiast spacji? Chcę wkleić dane wyjściowe do arkusza kalkulacyjnego; wypełnienie ze zmienną liczbą spacji utrudnia to. Ilustrować:

drwxr-xr-x 2 root root 4096 26 września 11:43 wpa_supplicant
-rw-r ----- 1 root dialout 66 września 26 11:43 wvdial.conf
drwxr-xr-x 9 root root 4096 8 października 08:21 X11
drwxr-xr-x 12 root root 4096 18 lutego 23:31 xdg
drwxr-xr-x 2 root root 4096 31 stycznia 06:11 xml
drwxr-xr-x 2 root root 4096 22 listopada 07:26 xul-ext
-rw-r - r-- 1 root root 349 13 stycznia 2012 zsh_command_not_found

We fragmencie z ls -l /etcpowyższego wiersze 1, 2 i 3 mają jedną cyfrę w kolumnie 2, podczas gdy wiersz 4 ma dwie. Oznacza to, że wyrównanie uzyskuje się za pomocą dwóch spacji do oddzielenia kolumn 1 i 2 w rzędach 1-3, ale tylko jednej spacji w rzędzie 4.

ls 

Odpowiedzi:


3

Dla tego samego stworzyłem skrypt powłoki. Zajmuje się przypadkami, gdy nazwy plików zawierają spacje lub inne znaki specjalne.

#! / bin / bash

SAVEIFS = $ IFS
IFS = $ (echo -en "\ n \ b")
dla pliku w $ (ls)
zrobić
    stat --printf = "Plik% A \ t% h \ t% U \ t% G \ t% s \ t" $ plik
    mod_epoch = $ (stat --format = plik "% Y" $)
    mod_month = $ (data -d @ $ mod_epoch + "% b")
    mod_day = $ (data -d @ $ mod_epoch + "% d")
    mod_time = $ (data -d @ $ mod_epoch + "% H:% M")
    printf "% s \ t% s \ t% s \ t% s \ n" $ mod_month $ mod_day $ mod_time $ plik
gotowy
IFS = $ SAVEIFS
  • Powiedzmy, że zapisz go w pliku ls_tab.sh
  • Spraw, by był wykonywalny:
chmod + x ls_tab.sh
  • Uruchom:
./ls_tab.sh

Uwaga: Można to zrobić analizując dane wyjściowe ls, jednak podano tutaj powód, dla którego nie należy tego robić .


1
Jeśli celem jest wiedzieć, co lsmówi , parsowanie jego wyników jest w porządku. To rzadko jest celem. Prawdopodobnie jest tutaj. Myślę, że zastosowana metoda jest całkiem dobra (każda metoda przyniesie niepożądane rezultaty, biorąc pod uwagę pewien zestaw potrzeb)! Jednak prawdopodobnie parsowanie lsmoże być lepsze. Rozważ przypadek nazwy pliku, która faktycznie zawiera znak tabulacji. ls -lzastępuje kartę ?znakiem. Skrypt zachowuje znak tabulacji, który utworzy dodatkowe kolumny, jeśli jego wynik zostanie zinterpretowany jako rozdzielany tabulatorami i użyty do utworzenia arkusza kalkulacyjnego. Psunie się, jeśli nazwa pliku ma nowy wiersz.
Eliah Kagan

1
Prawdziwe. Ale zwykle pliki nie mają \nlub \tich nazwy. Jeśli tak, to parsowanie danych wyjściowych za lspomocą prostych poleceń bash będzie bardziej złożone, ale można to osiągnąć. Mogę zaktualizować odpowiedź, jeśli PO chce obsłużyć takie przypadki.
zielony

Działa to dla mnie i długie nazwy plików ze spacjami są wyświetlane poprawnie. Moja użycie jest dość prosty i mam nadzieję, że nie radzić sobie z plikami z \ni \tw ich nazwach.

1
Doskonały. W przypadku arkusza kalkulacyjnego Windows użyj printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $filei przekieruj ouptut plik jako ./ls_tab.sh > listing.txt.
Fedir RYKHTIK

6

Próbować:

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

Lub, jeśli w nazwach plików znajdują się spacje:

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. Działa świetnie. Tego rodzaju rzeczy są właśnie po to awk. Sprytny!
tgies

Niestety nie działa to poprawnie w przypadku nazw plików zawierających spacje. Zastępuje je również zakładkami. Chociaż jest to prostsze i działa szybciej niż oparte na skrypcie rozwiązanie green7 , spowoduje to niepoprawne wyjście w dużej ilości czasu i nie ma przewagi nad metodą Adityi . Czy można to zmienić, aby spacje nie były już interpretowane jako ograniczniki wejściowe po 9 kolumnie?
Eliah Kagan

1
proszę zobaczyć aktualizację
philshem

@ psny18 Zaktualizowany sposób jest jeszcze bardziej zepsuty. To odcina wszystko, ale pierwsze słowo każdego pliku. Samo pisanie $9nie zmienia faktu, że awkzawsze interpretujesz spacje jako wskazujące na przerwę między kolumnami. $9przechwytuje tylko pierwsze słowo w tej pozycji, a ponieważ pozostałe słowa są uważane za osobne kolumny o wyższym numerze, nigdy nie są drukowane.
Eliah Kagan

Szkoda, że ​​nazwy plików nie są traktowane jako jedna kolumna, nawet jeśli mają w nich spacje.

1

Nie musimy nawet konwertować danych wyjściowych na tabulator rozdzielany. Przestrzeń między kolumnami jest wystarczająca.

Uruchom ls -lpolecenie w terminalu, tak jak zwykle, i skopiuj zawartość, którą chcesz wkleić w arkuszu kalkulacyjnym.

polecenie terminalu

Następnie otwórz program Arkusz kalkulacyjny (w moim przypadku LibreOffice Calc) i naciśnij Ctrl+, Vaby wkleić zawartość schowka.

Pojawi się Kreator importu tekstu. Upewnij się, że umieściłeś znacznik wyboru obok Spacei naciśnij Ok. Możesz obejrzeć podgląd w dolnym okienku.

Libo Text Import


1
To nie zadziała, gdy nazwy plików będą miały spacje
zielony

@ green7: Ach .. Nie zdawałem sobie z tego sprawy! :-)
Aditya

Nie tylko nazwy plików, ale także liczba znaków w kolumnach. Wypełnienie tam i gdzie indziej powoduje problemy, jeśli jako separator zostanie wybrana „spacja”. Przeredaguję pytanie, aby to zilustrować.

0

Python nadaje się do tego:

# 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 )
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.