Wie finde ich nur ausführbare Dateien mit 'find'?

8

locate gtagswürde alle benannten Dateien finden gtags.

Was ist, wenn ich nur ausführbare Dateien benötige? Gibt es eine Möglichkeit, dies zu tun?

Jichao
quelle
Werfen
Ryekayo

Antworten:

7

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 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
nohillside
quelle
Können Sie die Parameter näher erläutern?
AB
5

Die schnellste und kostengünstigste Lösung:

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:

  • 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 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.
  • 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 )
    • {}: 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.

LS
quelle
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.
Adam Ryczkowski
2

kurze Antwort, verwenden Sie GNU find:

find / -type f -executable -name '*gtags*'
AB
quelle