Gibt es eine "einfache" Möglichkeit, einen Befehl im "ls -la" -Stil auszuführen, um alle Dateien / ausführbaren Binärdateien im aktuellen PATH aufzulisten?
(Ich beabsichtige, die Ausgabe in grep weiterzuleiten, um nach Befehlen mit unbekannten Präfixen, aber im Grunde bekannten "Namen" zu suchen. Dies ist der Fall, wenn die automatische Vervollständigung / Tabulation in Bash im Wesentlichen nutzlos ist. Also eine Art "inverse automatische" komplettes Feature "...)
bash
ls
path
autocomplete
sme
quelle
quelle
ls -la
?Antworten:
quelle
which $(compgen -A function -abck)
?Hier ist eine Funktion, die den Inhalt der Verzeichnisse auflistet
$PATH
. Wenn Argumente übergeben werden, listet die Funktion nur Befehle auf, deren Name eines der Argumente enthält. Die Argumente werden als Glob-Muster interpretiert.Wie viele Dinge ist dies in zsh einfacher.
Das
^
Zeichen in der Parametererweiterung bewirkt, dass der mit dem Array verkettete Text zu jedem Array-Element hinzugefügt wird, z . B.path=(/bin /usr/bin); echo $^path/foo
Ausdrucke/bin/foo /usr/bin/foo
./*$^@*
sieht aus wie eine Comic-Beleidigung, ist aber tatsächlich das gewöhnliche Zeichen/
, der Platzhalter*
, der spezielle Parameter$@
(das Array der Positionsparameter) mit dem^
Modifikator und wieder*
.(N:t)
ist das Glob-QualifikationsmerkmalN
, um eine leere Erweiterung zu erhalten, wenn keine Übereinstimmung vorliegtt
, gefolgt vom Verlaufsmodifikator , um nur den Basisnamen ("Schwanz") jeder Übereinstimmung beizubehalten.Kryptischer, vermeidet den externen Anruf, aber dies ist nur von kosmetischem Interesse:
Möglicherweise suchen Sie tatsächlich nach dem
apropos
Befehl, der nach Manpages von Befehlen sucht, deren Kurzbeschreibung ein Schlüsselwort enthält. Eine Einschränkung besteht darin, dass nur Befehle gefunden werden, die eine Manpage haben.quelle
^
scheint die zweite zu keiner Ausgabe für einen Aufruf "keine Argumente" zu führen? Wenn Sie es löschen, können Sie alle auflisten und trotzdem nach einzelnen Schlüsselwörtern suchen (aber nicht nach einer Liste). Das(Non:t)
scheint zu sagen, dass Sternchen erweitert werden sollten? Konnte den letzten nicht herausfinden.path
, aber wenn ich es in der Shell ausführe, ist es zwar $ PATH, aber mit Leerzeichen anstelle von:
. Der Rest ist kristallklar :)$path
ist eine zsh-Funktion: Es ist ein gebundener Parameter , ein Array, das automatisch aktualisiert wird, wennPATH
es aktualisiert wird, und umgekehrt.Der Fund stimmt nur mit folgenden Punkten überein: Mindestens ein "x" -Bit (ausführbar) gesetzt, und das ist kein Verzeichnis.
und verwenden Sie es mit einer Liste von Regexp zu finden:
quelle
echo $PATH | tr ':' '\n' | sort | uniq -d
Zuerst wiederholen wir
$PATH
in sed und ersetzen ":" durch "".Dann suchen wir nach jedem dieser Dinge, um Dateien mit rwx zu finden und sie wiederzugeben.
2> /dev/null
wird alsofind
keine Fehler druckenquelle
-maxdepth 1
und-type f
in Ihrem Fund, sonst finden Sie Unterverzeichnisse und deren Dateien (was bei der PATH-Suche nicht der Fall ist). Außerdem ist Ihr Erlaubnis-Test seltsam - sollte nur für+x
, würde ich denken?:/bin
oder/bin::/usr/bin
. Versuchen Sies/::/:.:/;s/^:/.:/;s/:$/:./
, demsed
Befehl etwas hinzuzufügen .find
Kann tatsächlich mehr Pfade durchsuchen, so dass Sie es ohne die Schleife tun können:find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …
Natürlich werden Verzeichnisnamen, die Leerzeichen enthalten, es durcheinander bringen, aber der schleifenbasierte hat trotzdem das gleiche Problem.for
. Sofor
wird eine Liste von 4 Wörtern durchlaufen. Um die Wortteilung besser zu manipulieren, stellen Sie die EinstellungenIFS
entsprechend Ihren Anforderungen ein :IFS=':'; find $PATH -perm +rwx …
.