Kann ls -l dazu gebracht werden, Felder mit Tabulatoren anstelle von Leerzeichen zu trennen, um die Ausgabe in einer Tabelle nützlich zu machen?

10

Wie kann die Ausgabe von ls -lgeändert werden, um Felder mithilfe von Tabulatoren anstelle von Leerzeichen zu trennen? Ich möchte die Ausgabe in eine Tabelle einfügen. Die Polsterung mit einer variablen Anzahl von Leerzeichen macht dies schwierig. Um zu veranschaulichen:

drwxr-xr-x 2 root root 4096 26. September 11:43 wpa_supplicant
-rw-r ----- 1 Root-Dialout 66 26. September 11:43 wvdial.conf
drwxr-xr-x 9 root root 4096 8. Oktober 08:21 X11
drwxr-xr-x 12 root root 4096 18. Februar 23:31 xdg
drwxr-xr-x 2 root root 4096 31. Januar 06:11 xml
drwxr-xr-x 2 root root 4096 22. November 07:26 xul-ext
-rw-r - r-- 1 root root 349 13. Januar 2012 zsh_command_not_found

In dem ls -l /etcoben gezeigten Auszug haben die Zeilen 1, 2 und 3 eine einzelne Ziffer in Spalte 2, während Zeile 4 zwei hat. Das heißt, die Ausrichtung wird erreicht, indem zwei Leerzeichen zum Trennen der Spalten 1 und 2 in den Zeilen 1 bis 3 verwendet werden, jedoch nur ein Leerzeichen in Zeile 4.


quelle

Antworten:

3

Ich habe ein Shell-Skript für das gleiche gemacht. Es werden Fälle behandelt, in denen die Dateinamen Leerzeichen oder andere Sonderzeichen enthalten.

#! / bin / bash

SAVEIFS = $ IFS
IFS = $ (echo -en "\ n \ b")
für Datei in $ (ls)
tun
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $ Datei
    mod_epoch = $ (stat --format = "% Y" $ file)
    mod_month = $ (Datum -d @ $ mod_epoch + "% b")
    mod_day = $ (Datum -d @ $ mod_epoch + "% d")
    mod_time = $ (Datum -d @ $ mod_epoch + "% H:% M")
    printf "% s \ t% s \ t% s \ t% s \ n" $ mod_month $ mod_day $ mod_time $ file
erledigt
IFS = $ SAVEIFS
  • Speichern Sie es beispielsweise in einer Datei ls_tab.sh
  • Machen Sie es ausführbar:
chmod + x ls_tab.sh
  • Starte es:
./ls_tab.sh

Hinweis: Dies kann durch Parsen der Ausgabe von erfolgen ls. Der Grund, warum dies nicht erfolgen sollte, wird hier angegeben .

Grün
quelle
1
Wenn das Ziel darin besteht, zu wissen, was lsgesagt wird , ist das Parsen der Ausgabe in Ordnung. Das ist selten das Ziel. Wohl ist es hier. Ich denke , die Methode , die Sie verwendet haben , ist ziemlich gut (jedes Verfahren wird gegeben unerwünschten Ergebnissen führen einige Reihe von Bedürfnissen)! Das Parsen lskönnte jedoch besser sein. Stellen Sie sich den Fall eines Dateinamens vor, der tatsächlich ein Tabulatorzeichen enthält. ls -lErsetzt die Registerkarte durch ein ?Zeichen. Ihr Skript behält das Tabulatorzeichen bei, wodurch zusätzliche Spalten erstellt werden, wenn die Ausgabe als tabulatorgetrennt interpretiert und zum Erstellen einer Tabelle verwendet wird. Es verschlechtert sich stark, wenn ein Dateiname eine neue Zeile hat.
Eliah Kagan
1
Wahr. Aber normalerweise haben Dateien nicht \noder \tin ihren Namen. Wenn dies der lsFall ist , ist das Parsen der Ausgabe mit einfachen Bash-Befehlen komplexer, kann jedoch erreicht werden. Ich kann die Antwort aktualisieren, wenn das OP solche Fälle behandeln möchte.
Grün
Dies funktioniert bei mir und lange Dateinamen mit Leerzeichen werden ordnungsgemäß angezeigt. Meine Verwendung ist ziemlich einfach und ich hoffe, dass ich mich nicht mit Dateien mit \nund \tin deren Namen befassen kann .
1
Perfekt. Verwenden Sie für Windows Speadsheet printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $fileund leiten Sie die Datei als um ./ls_tab.sh > listing.txt.
Fedir RYKHTIK
6

Versuchen:

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

Oder wenn Ihre Dateinamen Leerzeichen haben:

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
quelle
+1. Funktioniert perfekt. Genau dafür ist genau das awkgedacht. Klug!
Tgies
Leider funktioniert dies bei Dateinamen, die Leerzeichen enthalten, nicht richtig. Es ersetzt sie auch durch Tabulatoren. Dies ist zwar einfacher und läuft schneller als die skriptbasierte Lösung von green7 , führt jedoch häufig zu einer falschen Ausgabe und hat keine Vorteile gegenüber der Aditya-Methode . Kann dies so geändert werden, dass Leerzeichen nach der 9. Spalte nicht mehr als Eingabetrennzeichen interpretiert werden?
Eliah Kagan
1
siehe Update
Philshem
@ psny18 Der aktualisierte Weg ist noch schlimmer kaputt. Es schneidet alles außer dem ersten Wort jedes Dateinamens ab. Das einfache Schreiben $9ändert nichts an der Tatsache, dass Sie awkLeerzeichen immer so interpretieren , dass sie einen Bruch zwischen Spalten anzeigen. $9erfasst nur das erste Wort an dieser Position, und da die anderen Wörter als separate Spalten mit höherer Nummer betrachtet werden, werden sie überhaupt nicht gedruckt.
Eliah Kagan
Schade, dass Dateinamen nicht als eine Spalte behandelt werden, auch wenn sie Leerzeichen enthalten.
1

Wir müssen die Ausgabe nicht einmal als tabulatorgetrennt konvertieren. Der Abstand zwischen den Spalten ist gerade gut genug.

Führen Sie Ihren ls -lBefehl wie gewohnt im Terminal aus und kopieren Sie den Inhalt, den Sie in eine Tabelle einfügen möchten.

Terminalbefehl

Öffnen Sie als Nächstes Ihr Tabellenkalkulationsprogramm (in meinem Fall LibreOffice Calc) und drücken Sie Ctrl+, Vum den Inhalt Ihrer Zwischenablage einzufügen.

Der Textimport-Assistent wird angezeigt. Stellen Sie sicher, dass Sie ein Häkchen neben setzen Spaceund drücken Ok. Sie können die Vorschau im unteren Bereich anzeigen.

Libo Text Import

Aditya
quelle
1
Dies funktioniert nicht, wenn Dateinamen Leerzeichen haben
grün
@ green7: Ah .. habe das nicht gemerkt! :-)
Aditya
Nicht nur die Dateinamen, sondern auch die Anzahl der Zeichen in Spalten. Das Auffüllen dort und anderswo verursacht Probleme, wenn "Leerzeichen" als Trennzeichen gewählt wird. Ich werde die Frage bearbeiten, um das zu veranschaulichen.
0

Python ist gut dafür:

# 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
quelle