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 findim 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).
Die while ...; do ... doneSchleife durchläuft jede Zeile, die sie von der Pipe empfängt (von locate).
read -r lineliest eine Eingabezeile und speichert sie in einer Variablen namens line(in unserem Fall einem Pfad- / Dateinamen)
[[ -x "$line" ]]testet, ob die Datei in $lineausführbar ist
Wenn dies der && echo $lineFall ist, druckt das Teil es auf Ihrem Bildschirm
locate -b '\gtags'| xargs -ri find {}-prune -type f -executable
Laut der xargsManpage übergibt die obige Syntax alle gefundenen Dateinamen locatean eine einzige Ausführung von find, die nur die angegebenen Dateien untersucht.
Diese Lösung ist besser als die zuvor angegebenen, weil:
Das findDurchsuchen jeder Datei auf dem System, beginnend mit dem Stammverzeichnis, kann ein kurzer Befehl sein, die Ausführung kann jedoch sehr lange dauern.
Die Verwendung einer Shell-while-Schleife zum Überprüfen jedes Dateinamens kann langsam sein, da jede Datei einzeln überprüft wird.
Da andere um detaillierte Erklärungen der in früheren Antworten angegebenen Parameter gebeten haben, sind die Details:
-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 locatedas 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.
{}: xargsErsetzt dies durch die Namen aller Dateien, die locatebei der Standardeingabe empfangen werden. findDurchsucht 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, locatedruckt die Namen der übereinstimmenden Dateien in die Standardausgabe, die (unter Verwendung |) in die Standardeingabe von weitergeleitet wird xargs. xargsliest die Dateinamen von der Standardeingabe und kombiniert sie zu einer durch Leerzeichen getrennten Liste in einer einzelnen Zeichenfolge. Wenn die Zeichenfolge nicht leer ist, xargsersetzen Sie die Zeichenfolge {}im findBefehl, bevor Sie sie ausführen.
Ich würde ausführbare Symlinks, die mit dem Dateinamen übereinstimmen, nicht ausschließen und -Lkurz vor dem {}Argument zum Fund hinzufügen . So könnten Sie zB finden gcc.
Antworten:
Nicht einfach. Sie können verwenden
um alle ausführbaren Dateien zu finden, in denen der Name enthalten ist
bash
. Dies ist schneller als die Verwendungfind
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 (vonlocate
).read -r line
liest eine Eingabezeile und speichert sie in einer Variablen namensline
(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 Bildschirmquelle
Die schnellste und kostengünstigste Lösung:
Laut der
xargs
Manpage übergibt die obige Syntax alle gefundenen Dateinamenlocate
an eine einzige Ausführung vonfind
, 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, dasslocate
das Muster so behandelt wirdgtags
, 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, dielocate
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 wirdxargs
.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{}
imfind
Befehl, bevor Sie sie ausführen.quelle
-L
kurz vor dem{}
Argument zum Fund hinzufügen . So könnten Sie zB findengcc
.kurze Antwort, verwenden Sie GNU find:
quelle