Antworten:
Nicht einfach. Sie können verwenden
locate bash | while IFS= read -r line; do [[ -x "$line" ]] && echo $line; done
um alle ausführbaren Dateien zu finden, in denen der Name enthalten ist bash
. Dies ist schneller als die Verwendung find
im gesamten Dateisystem, da nur wenige Dateien überprüft werden müssen.
locate bash
macht was es immer macht (listet alle Übereinstimmungen auf)|
(Pipe) nimmt die Ausgabe vom ersten Befehl ( locate
) und sendet sie an den zweiten (den Rest der Zeile).while ...; do ... done
Schleife durchläuft jede Zeile, die sie von der Pipe empfängt (von locate
).read -r line
liest eine Eingabezeile und speichert sie in einer Variablen namens line
(in unserem Fall einem Pfad- / Dateinamen)[[ -x "$line" ]]
testet, ob die Datei in $line
ausführbar ist&& echo $line
Fall ist, druckt das Teil es auf Ihrem BildschirmDie schnellste und kostengünstigste Lösung:
locate -b '\gtags' | xargs -ri find {} -prune -type f -executable
Laut der xargs
Manpage übergibt die obige Syntax alle gefundenen Dateinamen locate
an eine einzige Ausführung von find
, die nur die angegebenen Dateien untersucht.
Diese Lösung ist besser als die zuvor angegebenen, weil:
find
Durchsuchen jeder Datei auf dem System, beginnend mit dem Stammverzeichnis, kann ein kurzer Befehl sein, die Ausführung kann jedoch sehr lange dauern.Da andere um detaillierte Erklärungen der in früheren Antworten angegebenen Parameter gebeten haben, sind die Details:
locate
(Siehe: Aufrufen von Suchen - Suchen von Dateien )
-b
: Ordnen Sie nur den Basisdateinamen des Pfadnamens den angegebenen Mustern zu. Berücksichtigen Sie nicht die Namen der Verzeichnisse im Pfadnamen.\
: Da der Backslash ein Globbing-Zeichen ist, wird verhindert, dass locate
das Muster so behandelt wird gtags
, als ob es wäre *gtags*
. Dh es sucht nach Dateien, die den genauen Namen "gtags" ohne andere Zeichen vorher oder nachher haben.xargs
(Siehe: xargs-Optionen - Suchen von Dateien )
-r
: Wenn die Standardeingabe vollständig leer ist, führen Sie den Befehl nicht aus.-i
: Ersetzen Sie {}
im folgenden Befehl die Liste der Dateinamen, die aus der Standardeingabe gelesen wurden.find
(Siehe: Primärindex finden - Dateien suchen )
{}
: xargs
Ersetzt dies durch die Namen aller Dateien, die locate
bei der Standardeingabe empfangen werden. find
Durchsucht alle diese Dateien nach Übereinstimmungen mit den folgenden Ausdrücken. Wenn es sich bei ihnen um Verzeichnisse handelt, werden auch deren Inhalte überprüft.-prune
: Wenn ein ausgewerteter Dateiname zu einem Verzeichnis gehört, durchsuchen Sie dessen Inhalt nicht.-type f
: Nehmen Sie in die Ausgabe nur Dateinamen auf, die zu "normalen" Dateien gehören, keine speziellen wie Geräte, Named Pipes usw.-executable
: Nehmen Sie nur Dateinamen ausführbarer Dateien in die Ausgabe auf. Das heißt, diejenigen, bei denen eines oder mehrere ihrer ausführbaren Modusbits gesetzt sind, unabhängig vom Dateiinhalt.Kurz gesagt, locate
druckt die Namen der übereinstimmenden Dateien in die Standardausgabe, die (unter Verwendung |
) in die Standardeingabe von weitergeleitet wird xargs
. xargs
liest die Dateinamen von der Standardeingabe und kombiniert sie zu einer durch Leerzeichen getrennten Liste in einer einzelnen Zeichenfolge. Wenn die Zeichenfolge nicht leer ist, xargs
ersetzen Sie die Zeichenfolge {}
im find
Befehl, bevor Sie sie ausführen.
-L
kurz vor dem {}
Argument zum Fund hinzufügen . So könnten Sie zB finden gcc
.