it-swarm.com.de

Wie finde ich alle ausführbaren Binärdateien rekursiv in einem Verzeichnis?

Wenn ich den Befehl find wie folgt verwende:

find /mydir/mysubdir -executable -type f

alle ausführbaren Dateien werden aufgelistet (ausgenommen Verzeichnisse) und enthalten ausführbare Skriptdateien (wie script.sh usw.). Ich möchte nur ausführbare Binärdateien auflisten.

48
uray

Sie können das Dienstprogramm file ausprobieren. Laut Manpage:

Die magischen Tests werden verwendet, um nach Dateien mit Daten in bestimmten festen Formaten zu suchen. Das kanonische Beispiel hierfür ist eine ausführbare binäre Datei (kompiliertes Programm) a.out, deren Format im Standardverzeichnis include und möglicherweise im Verzeichnis include definiert ist.

Möglicherweise müssen Sie mit dem regulären Ausdruck herumspielen, aber so etwas wie:

$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'

die Datei bietet viele Optionen, daher sollten Sie sich die Manpage genauer ansehen. Ich habe die erste Option verwendet, die ich gefunden habe und die eine leicht zu grepende Ausgabe zu sein schien.

45
Steven D

Hier ist eine Möglichkeit, Skripte auszuschließen, d. H. Dateien, deren erste beiden Zeichen #! Sind:

find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print

Bei einigen Arten von Dateien ist nicht klar, ob sie als Skripte oder Binärdateien klassifiziert werden sollen, z. B. Bytecode-Dateien. Je nachdem, wie die Dinge eingerichtet sind, können diese mit #! Beginnen oder nicht. Wenn Ihnen dies wichtig ist, müssen Sie das innere Shell-Skript komplexer gestalten. So können Sie beispielsweise ELF-Binärdateien und ausführbare Mono-Dateien sowie Objective Caml-Bytecode-Programme einschließen, jedoch keine anderen Arten von ausführbaren Dateien wie Shell-Skripten oder Perl-Skripten oder JVM-Bytecode-Programmen:

find -type f -executable -exec sh -c '
    case "$(head -n 1 "$1")" in
       ?ELF*) exit 0;;
       MZ*) exit 0;;
       #!*/ocamlrun*) exit 0;;
    esac
    exit 1
' sh {} \; -print

Nur für den Fall, dass Sie sich auf einem System mit einem Downlevel find befinden (es gibt immer noch, wie ich schreibe, eine Menge wissenschaftlicher Cluster, auf denen RHEL5 ausgeführt wird!), Ohne die Rechte zum Aktualisieren: statt

find /mypath/ -executable -type f

in den obigen ausgezeichneten Antworten können Sie z.

find /mypath/h -type f -perm -u+x

die nach Berechtigungsbits sucht. Leider findet das oben genannte nur Dateien, für die der Benutzer eine ausführbare Datei hat, aber das funktioniert normalerweise für mich.

2
TomRoche