Ich habe ein Verzeichnis, in dem ich den gesamten Inhalt (Dateien und Unterverzeichnisse) auflisten möchte, ohne die symbolischen Links anzuzeigen. Ich benutze GNU-Dienstprogramme unter Linux. Die ls
Version ist 8.13.
Beispiel:
Vollständige Verzeichnisliste:
~/test$ ls -Gg
total 12
drwxrwxr-x 2 4096 Jul 9 10:29 dir1
drwxrwxr-x 2 4096 Jul 9 10:29 dir2
drwxrwxr-x 2 4096 Jul 9 10:29 dir3
-rw-rw-r-- 1 0 Jul 9 10:29 file1
-rw-rw-r-- 1 0 Jul 9 10:29 file2
lrwxrwxrwx 1 5 Jul 9 10:29 link1 -> link1
lrwxrwxrwx 1 5 Jul 9 10:30 link2 -> link2
Was ich gerne bekommen würde
~/test$ ls -somthing (or bash hack)
total 12
dir1 dir2 dir3 file1 file2
HINWEIS: Meine Hauptmotivation ist es, ein rekursives grep (GNU grep 2.10) zu machen, ohne Symlinks zu folgen.
grep
(siehe letzter Absatz).grep -H
, wenn Sie es haben (sieheman grep
) oder auf andere Weisegrep 'pat' '{}' /dev/null ';'
, um sich vorzustellen, dass es mehrere Dateien gibt, wenn Sie dies nicht tun.+
wird dieser Anforderung in dem entarteten Fall nicht gerecht, in dem am Ende nur noch eine Datei oder eine Datei übrig ist.Oder einfacher:
Erläuterung
ls -l
bedeutet, in langer Form aufzulisten . In diesem Fall enthält die erste Zeichenfolge Informationen zu jeder Datei. Das erste Zeichen gibt an, um welchen Dateityp es sich handelt. Wenn es sich um einen Symlink handelt,l
ist an das erste Zeichen.grep -v ^l
bedeutet,-v
die Zeilen herauszufiltern , die mit (^
) beginnenl
.quelle
for i in
-l
inls
. Dies würde also nicht wie erwartet funktionieren:ls | grep -v ^l
find
wird nicht durchlaufenAb Version 2.12
-r
dereferenziert die Option für GNU grep keine symbolischen Links mehr, es sei denn, Sie geben sie manuell an:quelle
-R, -r, --recursive Read all files under each directory, recursively; this is equivalent to the -d recurse option.
in 2.10In zsh wäre dies dank glob-Qualifikatoren einfach :
Das Muster
**/
durchläuft Unterverzeichnisse rekursiv. Das Glob-Qualifikationsmerkmal.
schränkt den Abgleich mit regulären Dateien ein.Verwenden Sie ohne zsh
find
(siehe Antwort von Michael Horner ). Und in diesem speziellen Fall kann GNU grep tun, was Sie wollen (genau dasgrep -r
tut es) - aber erst seit Version 2.12 folgten frühere Versionen symbolischen Links.quelle
Sie können dazu verwenden
$LS_COLORS
. Wenn Ihre Version vonls
die Angabe der Farben mithilfe dieser Variablen unterstützt, können Sie die Ausgabe pro Dateityp definieren. Es ist eingebautes Verhalten und sehr konfigurierbar. Deshalb habe ich einige Dateien erstellt, um dies zu demonstrieren:Also mache ich jetzt:
Und die Nullen sind auch da ...
Sie können für alle oder beliebige Dateitypen angeben. Wenn Sie dies nur für einen Dateityp tun, erhalten Sie möglicherweise keine Ergebnisse, da
ls
einige standardmäßige Kompilierungswerte für Terminal-Escapes enthalten sind. Es ist viel besser, die API als einzelne Schnittstelle zu adressieren. Im Folgenden finden Sie eine einfache Methode zum Parsen und Zuweisen der Standardeinstellungen für die aktuelle Umgebungdircolors
:Die Ausgabe in meinem Home-Verzeichnis sieht folgendermaßen aus:
Sie können das auch ausführen,
cat -A
und der einzige Unterschied besteht darin, dass Sie$
für Zeilenumbrüche sehen -ls --color=always
mit dieser Konfiguration werden keine nicht druckbaren Zeichen eingeführt - nur das, was Sie hier sehen.ls
fügt sein Standardterminal so ein:... wobei die Standardwerte für
$lc
(links vom Code) ,$rc
(rechts vom Code) und$rs
(zurückgesetzt) sind:...beziehungsweise.
${type_code}
wird verwendet, um für die verschiedenenfi
(reguläre Datei - Standardeinstellung nicht festgelegt) ,di
(Verzeichnis) ,ln
(Verknüpfung) und jeden anderen mir bekannten Dateityp zu stehen. Es gibt auch$no
(normales), das ebenfalls standardmäßig nicht gesetzt ist und das hier//
am Anfang jeder Zeile dargestellt wird. Mein einfacher kleinerIFS=:
Block fügt einfach den Namen für jedes konfigurierbare Element als eigenen Wert ein und fügt ein oder zwei Schrägstriche hinzu - obwohl auch\0
NUL-Bytes ausreichen würden.Standardmäßig
ls
wird auch eine$rs
unmittelbar vor der ersten Ausgabe eingefügt$lc
- dies wird hier jedoch nicht genau dargestellt. In diesem Fall habe ich$ec
(Endcode) angegeben, der$rs
in allen Fällen für steht - wenn es angegeben ist, erhalten Sie$rs
zwischen$no
und${type_code}
wie sonst auch kein Extra - es wird nur unmittelbar nach einem Dateinamen und einmal am Anfang der Ausgabe angezeigt - Wie Sie in dem einen zusätzlichen Schrägstrich am Anfang der ersten Zeile sehen können.Hier ist ein Ausschnitt von mir
$LS_COLORS
Und in Wahrheit ist mein kleiner Shell-Hack wahrscheinlich zu kompliziert - es gibt eine weithin verfügbare Schnittstelle, um diese Werte zuzuweisen. Versuchen Sie es
dircolors -p
in Ihrem CLI undinfo dircolors
für weitere Informationen dazu.Sie können die Dateinamen in beliebige Zeichenfolgen einschließen. Sie können sie auskommentieren, wenn Sie möchten. Sie können ähnliche Verhaltensweisen nur basierend auf der Dateierweiterung angeben. Es gibt wirklich nicht viel, was man so nicht spezifizieren kann.
Jetzt denke ich mir auch nicht nur das alles aus - ich habe es erfahren, nachdem ich versehentlich über den Quellcode gestolpert bin .
Mit dieser speziellen Konfiguration
ls
wird Folgendes ausgegeben:$no
- Einmal pro Datensatz am Anfang jedes Datensatzes${type_code}
- Einmal unmittelbar vor jedem Dateinamen, um eine Abkürzung des Dateityps einzufügen, die immer in der gleichen Zeile wie und in 7 durch Leerzeichen getrennten Feldern nach$no
oder unmittelbar nach->
dem Ziel eines symbolischen Links vorkommt.$ec
- einmal unmittelbar vor der ersten Zeile und danach nur einmal unmittelbar nach jedem Dateinamen.Alle anderen Werte sind leer.
Was folgt, ist eine durch Nullen getrennte Zeichenfolge
ls
, und dieses Mal werde ich sie verwendencat -A
. Ohne diese Zeichenfolge würde sie jedoch genauso aussehen wie das letzte Beispiel:Um alle symbolischen Links aus einer
-l
solchen Liste zuverlässig zu entfernen , können Sie eine einfache Änderung vornehmen:Meine Ergebnisse nach dem Laufen sehen so aus ...
Verwenden Sie einen Befehl wie den oben beschriebenen:
... (wo
fc1
undfc2
welche Dateitypen nachset --
in der Subshell aufgelistet sind) sollten dazu dienen, Kombinationen von Dateitypen, die Sie möchten, zuverlässig aus derls
Ausgabe zu entfernen, unabhängig davon, welche Zeichen die Dateinamen enthalten könnten.quelle
lc
,nc
etc sind?ls
dendi=
Wert von 's kompiliert wurden . Sie müsstendi=:
die Variable ergänzen, um dies zu annullieren - und für alle anderen. Das meine ich mit der API - Sie adressieren jeden Dateityp, aber Sie müssen die Schnittstelle in allen Fällen gleich adressieren. Das Festlegenln
einer Richtung und das Ignorieren derdi
Standardeinstellungen funktioniert also nicht. Es gibt auch viele Standardeinstellungen ... Hmm. Deine Fragen zulc
undnc
und so sind gültig - völlig - ich habe es aber schon neulich getan. Ich werde es verknüpfen, denke ich.dircolors
. Es liest eine Konfigurationsdatei und gibt einen Shell-eval
freundlichen var-Wert aus. Es ist ziemlich einfach - aber die wenigen Angestellten dort oben sind es auch. Wie auch immer, wenn Sie verwenden möchten,dircolors
speichern Sie einfach zwei verschiedene Dateien und rufen Sie sie auf diese Weise auf. Außerdem habe ich Ihnen\0
neulich gezeigt, wie Sie bei jeder Escape-Sequenz beides gleichzeitig mit NUL-Begrenzern tun können .LS_COLORS='rs=:no=\0//:lc=:rc=:ec=\0//:'$( set -- di fi ln mh pi so do bd cd or su sg ca tw ow st ex; for fc do printf %s "$fc=/$fc//\0:"; done) ls -l --color=always | cat -A
Die Antwort oben führte zu Folgendem:
Seltsamerweise gibt das Auslassen der 1 aus dem ls-Befehl immer noch eine Liste.
quelle
grep -i
? Es ist nicht so, als ob/
Groß- oder Kleinschreibung möglich wäre.ls
Standardmäßig wird ein Noe-Spaltenformat verwendet, wenn die Ausgabe kein Terminal ist (hier ist es eine Pipe).Probier diese:
quelle
a -> b
. Es wird auch bei Dateinamen mit Zeilenumbrüchen und anderen Seltsamkeiten fehlschlagen. Bitte lesen Sie dies, um herauszufinden, warum das Parsen von ls eine schlechte Idee ist.ls
ist es ein Alias fürls -l
, und dies gibt Spalten vor dem Dateinamen zurück, oder es ist nicht so, und dies macht nichts Besonderes in Bezug auf symbolische Links.ls
analysiert sich. Wir alle analysierenls
jedes Mal, wenn wir auf ein Terminal drucken - es gibt eine API . Ich habe hier eine Antwort gepostet, die so etwas demonstriert - aber Sie können noch viel mehr tun. Ich habe es dir neulich gezeigt - du hattest selbst Dateinamen ohne Trennzeichen.ls
isst nicht deine Kinder oder so was - es ist nur ein Programm. Wenn Sie erklären es nicht dann es wird dauern mehrere hundert , es zu erklären und mehrere hundert mehr zu erklären , warum die mehrere hundert Zeilen , die Sie gerade verbunden sind falsch. Und außerdem - das sind nur zwei Zeilen:LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \ ls -1 --color=always | cat
Versuchen Sie diesen Befehl:
ls -p | grep -v @
quelle
find -type f
-p
fügt nur einen Schrägstrich zu Verzeichnissen hinzu, Sie suchen-F
ii) Ihrefind
Alternative listet keine Verzeichnisse auf und iii) Bitte testen Sie Ihre Antworten vor dem Posten.