Sagen Sie `ls`, dass nur der Basisdateiname gedruckt werden soll


21

Dies ist das Standardverhalten von ls

ls /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86/pool/v/vi/virtualenv-1.4.4_linux-x86_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86_64/pool/v/vi/virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/macosx/pool/v/vi/virtualenv-1.4.4_macosx_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/win32-x86/pool/v/vi/virtualenv-1.4.4_win32-x86_2.6_1.pypm

Wie kann ich lsnur den Basisnamen drucken lassen? Mögen:

ls $OPTIONS /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
virtualenv-1.4.4_linux-x86_2.6_1.pypm
virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
virtualenv-1.4.4_macosx_2.6_1.pypm
virtualenv-1.4.4_win32-x86_2.6_1.pypm

Hinweis : Ich bevorzuge die Verwendung von Shell-Globbingfind von / net / nas / data / languages ​​/ pypm / sites / rex / free, das eine große Anzahl von Dateien und Verzeichnissen enthält.


1
Sie bevorzugen Shell Globbing über Find, wenn das Verzeichnis viele Dateien enthält? Tippfehler??
Akira

1
Ich vermute, dass das OP keine Auflistung von Unterverzeichnissen möchte und sich der Möglichkeit der Weitergabe -maxdepth 1an nicht bewusst ist find.
Intuited

Antworten:


19

While xargs -0soll für Eingaben verwendet werden, die durch \ 0 (like find -print0) begrenzt sind.ls gibt es keine solche Option, um die Ausgabe auf diese Weise zu begrenzen.

Jedoch,

ls -1 /path/glob | tr '\n' '\0' | xargs -0 -n 1 basename

würde den Trick tun, um Newlines auf dem Weg in Nullen umzuwandeln. Auf diese Weise können xargs mit Namen arbeiten, die Leerzeichen enthalten.

BEARBEITEN: -n 1zu xargs hinzugefügt


Dies funktioniert bei mir nicht: basename: extra operand \ 033 [0m / net / nas / data / languages ​​/ pypm / sites / rex / kostenlos / 2.6 / macosx / pool / v / vi / virtualenv-1.4.4_macosx_2.6_1.pypm \ 033 [ 0m'`
Srid sagt Reinstate Monica

@Sridhar: brauchst du das evtl. -n 1woanders als option vorgeschlagen xargs? (Antwort bearbeitet)
Steve Folly

Obwohl ich persönlich meine eigene Antwort bevorzuge (da ich mich fast nie mit Leerzeichen in Dateinamen befassen muss), werde ich dies als Antwort markieren, die auch Leerzeichen behandelt.
Srid sagt Reinstate Monica

Wenn die Mac-Version von xargs die -dOption (Trennzeichen) unterstützt, können Sie dies tun ls ... | xargs -d '\n' -n 1 basename.
Intuited

12

Ich benutze das:

ls | tr '\n' '\n'

Es gibt eine Liste wie:

file1.mp3
file2.mp3
file3.mp3
...

3
Dies ist im Wesentlichen dasselbe wie ls -1(und das Färben ist deaktiviert), wie dies lsimpliziert, wenn nicht in ein Terminal geschrieben wird. Es sieht so aus, als ob Sie den Punkt ein wenig verfehlen, da das Problem darin besteht, den Verzeichnisnamen zu entfernen, wenn Pfadargumente mit Platzhaltern angegeben lswerden. Versuchen Sie ls -d "$PWD/"* | tr '\n' '\n'zu sehen, was das eigentliche Problem ist.
Daniel Beck

-1 - Ich bin mir nicht sicher, warum die Leute diese Antwort weiter abstimmen. Es macht nicht nur das Gleiche wie ls -1, es funktioniert auch nicht, wenn Globs verwendet wurden, wie Daniel Beck betonte.
Slhck

-1 - Dies ist dasselbe wie ls -1und funktioniert nur im aktuellen Verzeichnis, nicht mit einem Pfad wie ls path/*.
Brendan Byrd,


4

awk Lösung:

ls -1 /path/glob | awk -F'/' '{print $NF}'

2

ls [optionaler Pfad] | xargs -0 Basisname


2
-1: ls kann Namen nicht durch \ 0 abgrenzen, wonach xargs -0gesucht wird.
Steve Folly

2

Sowohl der GNU-Basisname als auch der FreeBSD-Basisname akzeptieren ein -aArgument, mit dem Sie mehrere Pfade an den Befehl übergeben können. Dies funktioniert hervorragend mit Shell-Globbing.

basename -a /path/glob*

1

Sie sagten, Sie würden lieber herumhüpfen find, aber wussten Sie, dass sich die beiden nicht gegenseitig ausschließen? Das Globbing erfolgt bei jedem Befehl, den Sie ausführen, nicht nur ls. Beispielsweise:

$ export BASE=/net/nas/data/languages/pypm/sites/rex/free/2.6

$ echo $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ ls $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -print0 | xargs -0 basename

Beachten Sie, dass das Beispiel find -print0 verwenden kann, was praktisch ist, wenn Ihre Pfade Leerzeichen enthalten (das tr anderer Stelle erwähnten -basierten Lösungen eignen sich hervorragend für normale Leerzeichen, jedoch nicht für Dateien mit tatsächlichen Zeilenumbrüchen).

Wenn Sie Zugriff auf GNU find haben, können Sie auch -printf verwenden, wodurch der Aufruf des Basisnamens insgesamt vermieden wird:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'

Leider ist die -printfOption in der MacOSX-Version von nicht verfügbar find.
Srid sagt Reinstate Monica

Guter Anruf; Entschuldigung für das Versehen. Ich habe die Antwort aktualisiert.
Ryan Bright

-3

Gehen Sie in das Verzeichnis, in dem Sie alle Dateien gespeichert und eingegeben haben.

find *.pypm

1
OP erklärte ausdrücklich, dass er nicht verwenden möchte find.
Gronostaj

1
Auch dies tut nicht einmal das, was das OP benötigt. (Hinweis: Sie sollten verwenden, find . -name '*pypm'wenn überhaupt ... nur das Platzieren des Glob als nächstes zu finden ls *.pypm
bringt
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.