Wie kann ich nur eine Spalte der Ausgabe des Befehls ls wiedergeben?


54

Sagen wir, wenn ich ls befehle, ist die Ausgabe:

file1 file2 file3 file4

Ist es möglich, nur eine bestimmte Ausgabespalte anzuzeigen, in diesem Fall file2? Ich habe folgendes ohne Erfolg versucht:

echo ls | $2

Grundsätzlich möchte ich nur die zweite Spalte ausgeben, in diesem Fall möchte ich Folgendes ausgeben:

file2

2
Was ist eine Situation , in der Sie wirklich eine wollen Spalte der lsAusgabe?
Michas

11
Generell sollten Sie niemals ls analysieren . Es gibt fast immer bessere Möglichkeiten, um die benötigten Informationen zu erhalten.
Terdon

Ich würde , dass Fremde nicht tun: P (sorry ich mochte Allways , dass die Phrase) die Anzahl der Spalten hängen von den Namen von Dateien und Ordnern, also der 2. Säule kann diejenige , die Sie sein wollen, oder auch nicht, oder in einem sein kann lsund Nach dem Erstellen einiger Dateien / Ordner ist es möglicherweise nicht mehr das, was Sie möchten. Wie Terdon darauf hingewiesen hat, gibt es sicher bessere Möglichkeiten, um zu bekommen, was Sie wollen
YoMismo

Antworten:


81

Der folgende Befehl formatiert die Ausgabe in eine Spalte

ls -1 /directory

2
Aber es gibt Ihnen nicht nur die eine Spalte, die das OP interessiert.
Anthon

1
Um es richtig zu machen: ls -1 /directory | head -2 | tail -1oderls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@ Kwubbufetowicz ls | sed -n '1p;q'scheint einfacher
Fiximan

3
Die Antwort habe ich gesucht, aber nicht für die Frage der OP.
Michael Lang

36

Du suchst das:

ls -C | awk '{ print $2 }'

Gehen Sie jedoch davon aus, dass Sie versuchen, diesen Dateinamen später zu verwenden, da er bei Dateinamen mit Leerzeichen abbricht. Fügen Sie stattdessen die Dateien in ein Array ein und holen Sie sich das zweite, wodurch das Parsen überhaupt vermieden wird:

files=(*)
printf '%s\n' "${files[1]}"

Die Reihenfolge, in der Sie die Dateien zurückerhalten, hängt vom Wert von ab LC_COLLATE. Daher möchten Sie möglicherweise LC_COLLATE=Czuerst festlegen , ob in allen Eckfällen eine "Standardsortierung" erfolgen soll.


Beachten Sie, dass Array-Indizes 1in sinnvollen Shells (zsh, yash, fish, csh, tcsh, rc, es ...) und 0in ksh und bash beginnen. Für eine Lösung, die für alle Bourne-ähnlichen Shells portierbar ist, können Sie set -- *; printf '%s\n' "$2"stattdessen Folgendes verwenden:
Stéphane Chazelas

@ StéphaneChazelas Zumindest für diese Frage enthalten die Tags "bash", daher ist diese Antwort für diese Shell spezifisch.
Chris Down

ls -C | awk '{print $ 1} sieht genauso aus ... warum $ 2?
Boctulus

7

Sie müssten hinzufügen -Cals lsEinsäulen-Modus verwendet , wenn der Ausgang kein Terminal ist. awkdruckt dann die zweite Spalte:

ls -C | awk '{print $2}'

2

Ich glaube du suchst

ls -1

Es werden keine Berechtigung, Eigentümer, Gruppe, Datum, Größe ..., sondern ein einfacher Dateiname in einer Spalte angezeigt.


1
Diese Antwort ist nicht nur falsch, sondern wurde auch schon einmal gegeben.
Scott

Obwohl mir klar ist, dass dies für die ursprüngliche Frage falsch ist, habe ich danach gesucht. Also vielen Dank.
AntumDeluge

0

Der einzige Weg für mich ist das Hinzufügen von "-all". Das ist:

ls -C -all | awk '{ print $1 }'

Weil -allmehr Spalten wie Benutzer, Berechtigungen usw. hinzugefügt werden.


0

Wie bereits erwähnt, ist die Verwendung von Spalten zum Parsen der lsAusgabe nicht sehr robust, da lsdie Zeilen entsprechend der Länge Ihres Dateinamens und der Terminalbreite getrennt werden. Oft ist es jedoch interessant, eine einzelne Spalte einer Liste von Elementen anzuzeigen. Sie können dies mit dem Befehl cut tun:

echo file1 file2 file3 file4 | cut -d" "  -f2

wird angezeigt

file2

Beachten Sie, -ddass Sie den Spaltentrenner auswählen können, zum Beispiel mit

cur -d, -f2

Sie können die zweite Spalte einer durch Kommas getrennten Liste anzeigen.


0

Angenommen, Sie möchten nur den bestimmten Dateinamen unter dem aktuellen Pfad anzeigen, verwenden Sie den folgenden Befehl

Befehl:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

Dies ist schwierig, da das Parsen ls -Cvon Folgendem abhängt:

  1. Dateinamenlänge (hängt von der angegebenen Dateiliste ab, an die weitergeleitet wird ls -C)
  2. Klemmenbreite.
  3. Die ls -CAusgabe ist säulenförmig, kann jedoch als Feldtrennzeichen auf eine unterschiedliche Anzahl von Leerzeichen konfiguriert werden.
  4. die Möglichkeit von Leerzeichen in Dateinamen (deren Anzeige von den lsgewählten Anzeigeoptionen abhängt ).

Beginnen wir zunächst mit dem einfacheren Problem ( dh nicht # 4 oben), vorausgesetzt , die Dateinamen enthalten kein Leerzeichen . So drucken Sie Spalte 2:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

Das abrollen:

  • COLUMNS=$COLUMNSgarantiert, dass die zugeführte Spaltenlänge | mit der aktuellen Terminalanzeige übereinstimmt. Das Ändern in einen willkürlichen Wert funktioniert auch, sodass COLUMNS=50oder veranlasst COLUMNS=70 würde ls -C, die Dinge entsprechend diesen Breiten neu zu ordnen.

    Eine andere Methode wäre die Verwendung des -wSchalters, z .

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trmacht die Feldtrennzeichen konsistent: eine einzelne Registerkarte zwischen jeder Spalte.

  • cut gibt die gewünschte Spalte aus.


Whitespace-Methode ausstehend ...
15.

-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

Ändern Sie die Anzahl der Zeichen (54) nach Bedarf, sodass Sie nur die gewünschten Daten erhalten.


2
Um dies zu verdeutlichen, verwenden Sie 54-Tells, die von Position 54 an auf jedes Zeichen zugeschnitten sind. es hört nicht bei "vom Menschen erkannten" Kolumnen auf
Jeff Schaller

Es ist keine schlechte Idee ... muss nur verfeinert werden.
Preußen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.