Ich kann verwenden, ls -ld */
um alle Verzeichniseinträge im aktuellen Verzeichnis aufzulisten. Gibt es eine ähnlich einfache Möglichkeit, alle regulären Dateien im aktuellen Verzeichnis aufzulisten? Ich weiß, dass ich find verwenden kann
find . -maxdepth 1 -type f
oder stat
stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-
aber diese scheinen mir nicht übermäßig elegant zu sein. Gibt es eine nette kurze Möglichkeit, nur die regulären Dateien aufzulisten (mir sind Geräte, Pipes usw. egal), aber nicht die Unterverzeichnisse des aktuellen Verzeichnisses? Auch symbolische Links aufzulisten wäre ein Plus, ist aber keine Notwendigkeit.
find
Befehl der beste Weg, um das zu tun, was Sie wollen. Für einige zuverlässige andere Optionen sollten Sie sich die Shell-spezifischen Befehle ansehen (und diese sind alles andere als portabel)!ls -d */
, das kurz, einfach zu tippen und leicht zu verstehen ist. Daher bin ich mit Ulrich Dangel's Antwort ziemlich zufrieden, obwohl ich kein zsh verwende.Antworten:
Mit
zsh
und Glob Qualifiers können Sie es einfach direkt ausdrücken, zB:Je nach Konfiguration wird entweder nur die Liste der regulären Dateien oder ein Fehler zurückgegeben.
Für die Nicht-Verzeichnisse:
(Enthält symbolische Links (einschließlich zu Verzeichnissen), Named Pipes, Geräten, Sockets, Türen ...)
für reguläre Dateien und Symlinks zu regulären Dateien.
für Nicht-Verzeichnisse und auch keine Symlinks zu Verzeichnissen.
Sehen Sie sich auch das
D
Globbing-Qualifikationsmerkmal an, wenn Sie beispielsweise D ot-Dateien (versteckte Dateien) einschließen möchten*(D-.)
.quelle
Dieser Befehl listet alle nicht ausgeblendeten Dateien auf, die keine Verzeichnisse sind (normale Dateien, Links, Gerätedateien usw.). Um auch versteckte Dateien einzuschließen, fügen Sie die
-A
Option zu hinzuls
Es wird davon ausgegangen, dass keine der Dateien Zeilenumbrüche im Namen enthält. Das Hinzufügen einer
-q
Option zumls
Transformieren aller nicht druckbaren Zeichen, einschließlich Zeilenvorschub in?
, stellt sicher , dass sie sich in einer Zeile befinden, und eignet sich daher zum Weiterleiten an ein zeilenbasiertes Dienstprogramm wiegrep
und zum Drucken auf einem Terminal.quelle
--color=always
um diels
, für OSX-G
.sudo chmod 777
am Ende hinzuzufügen , und ich bekam Fehler ... Jede Hilfe wird sehr geschätztls -pL | grep -v /
. Die hinzugefügten-L
dereferences symbolische Links.ls -pdL something* | grep -v /
. Die hinzugefügte-d
Option listet die Verzeichnisse selbst und nicht deren Inhalt auf, sodass sie korrekt ausgeschlossen werden.So listen Sie nur reguläre Dateien auf:
Mit symbolischen Links (zu jedem Dateityp):
Wo das erste Zeichen der Liste den Dateityp beschreibt,
-
bedeutet dies, dass es sich um eine reguläre Datei handelt, für die eine symbolische Verknüpfung bestehtl
.Debian / Ubuntu
Geben Sie die Namen aller übereinstimmenden Dateien (einschließlich Links) aus:
Mit absoluten Pfaden:
Drucken Sie die Namen aller Dateien
/etc
, die mit beginnenp
und mit endend
:quelle
ls
Es gibt keine Möglichkeit, dies zu tun, aber eines der schönen Dinge an Unix & Linux ist, dass langatmige und unelegante Pipelines leicht in ein Shell-Skript, eine Funktion oder einen Alias umgewandelt werden können. und diese können wiederum wie jedes andere Programm in Pipelines verwendet werden.(HINWEIS: Es gibt einige Probleme mit dem Gültigkeitsbereich von Funktionen und Aliasen. Für alle ausführbaren Dateien, die diese lesen und ausführen können, stehen Skripts zur Verfügung. Aliase und Funktionen sind nur in der aktuellen Shell verfügbar, auch wenn das .profile / .bashrc usw. einer Sub-Shell möglicherweise neu definiert wird Außerdem kann ein Skript in einer beliebigen Sprache geschrieben werden - einschließlich bash / sh, awk, perl, python und anderen - je nachdem, welche Sprache für den Job am besten geeignet ist oder mit welcher Sie am vertrautesten sind.
z.B
alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'
Ich habe xargs hinzugefügt, damit Sie alle üblichen
ls
Optionen verwenden können, zlsf -lrS
Da es verwendet wird
find
, werden alle normalerweise ausgeblendeten Punktedateien angezeigt und allen Dateinamen wird das Präfix ./ vorangestellt - das ist der einzige Unterschied, den Sie bemerken werden.Sie könnten Punktedateien mit ausschließen,
! -iname '.*'
aber dann müssten Sie zwei Versionen des Alias haben - eine, die Punktedateien anzeigt, und eine, die keine hat.alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'
Wenn
lsf
es sich um ein Skript und nicht um einen Alias handelt, können Sie die Optionen auch analysieren (z. B. mit getopts oder / usr / bin / getopt oder ähnlichem) und Punktdateien ausschließen, sofern diese nicht-a
vorhanden sind.quelle
-name
reicht, brauchst du nicht-iname
.Die Option -F für ls hängt * an ausführbare Dateien, / an Verzeichnisse, @ an symbolische Links, = an Sockets und | zu FIFOs. Sie können dann grep verwenden, um die nicht regulären Dateizeichen von der Ausgabe auszuschließen, und Sie haben die Dateien. Dies funktioniert in jeder Shell, nicht nur in zsh.
Die Schwächen sind:
@
,=
oder|
wird ausgeschlossen (aber Sie sollten nicht wirklich haben Dateien mit diesen Zeichen im Namen sowieso)quelle
=
,@
oder|
Zeichen.=
ist in Maildir- oder Dateinamen üblich, die einen base64- oder quoted-printable-codierten Teil haben.@
in Gebietsschemadefinitionen für E-Mail-Adressen und mehr. Es ist jedoch selten, dass sie am Ende des Dateinamens stehen. (Nur 31 von 2,2 Millionen auf diesem System zum Beispiel)Im Handbuch heißt es, dass die Option 'f' nur für 'reguläre Dateien' gilt, nicht für Pipes, Sockets oder Block / Char-Geräte. Das bedeutet, dass Sie bereits die richtigen Dinge tun.
quelle
Dies ist nicht besonders kurz, aber Sie können es in ein Skript oder einen Alias umwandeln, wenn Sie es schnell aufrufen müssen. Verwenden Sie den Befehl ls als Eingabearray und rufen Sie ls -ld für jeden an grep weitergeleiteten Eintrag auf, um Verzeichnisse auszuschließen, deren Ausgabe an null gesendet wurde. Wenn dies erfolgreich war, geben Sie die ursprüngliche Eingabe ein:
Sie können die Ausgabe von grep und conditional invertieren, die gleichen Ergebnisse:
quelle
\dev\null
?!?!Dies ist ein etwas alter Thread, aber der sauberste Weg, nur Dateien aufzulisten.
quelle
touch "some file name"
um ein kurzes Gegenbeispiel zu sehenls -al | grep '^-' | awk '{ for(i=9; i<=NF; ++i) printf $i""FS; print "" }'
, sollten die Dateien mit Leerzeichen behandeln.