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
John
quelle
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
ch0ps
quelle
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.

Chris Down
quelle
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}'
tkrennwa
quelle
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.

Niti
quelle
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.

Diego Andrés Díaz Espinoza
quelle
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.

Ein Roebel
quelle
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"
Praveen Kumar BS
quelle
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.

agc
quelle
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.

m.rumore
quelle
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