Wie kann ich alle Python- und Shell-Skripte in meinem gesamten System zählen?

Wie kann ich alle Python- und Shell-Skripte in meinem gesamten System zählen?

Wie kann ich alle Python- und Shell-Skripte in meinem gesamten System zählen?

Antwort1

In Ermangelung eines spezifischeren Ziels wird dies unabhängig davon, wie Sie es tun, nur eine Annäherung sein, da es Unklarheiten darüber gibt, was ein Shell-Skript und was ein Python-Skript ausmacht. Das macht das Problem nicht allzu unklar,solange Sie eine Annäherung wünschen. Und Sie können eine gute Annäherung erhalten.

Vor diesem Hintergrund schlage ich diesen Befehl zum Auflisten von Shell- und Python-Skripten vor:

find . -type f -executable -exec file {} + | grep -Ei '(python|shell) script,'

Wenn die Ausgabe Ihren Anforderungen entspricht, können Sie sie mit den entsprechenden Änderungen erneut ausführen, um die Anzahl der Ergebnisse zu zählen:

find . -type f -executable -exec file {} + | grep -Ei '(python|shell) script,' | wc -l

Möglicherweise erhalten Sie einige „Zugriff verweigert“-Fehler. Das ist in Ordnung. Ich empfehle nicht, diese Fehlermeldungen zu unterdrücken, da Sie sie lesen oder zumindest durchsehen sollten, um festzustellen, ob Sie anscheinend nicht auf für Sie interessante Dateien oder Speicherorte zugreifen konnten. Sie können den findBefehl als Root ausführen sudo, wenn Sie das wirklich möchten.

  • -type fbewirkt, dass nur normale Dateien gefunden werden. Normalerweise ist es besser, -xtype fsymbolische Links einzuschließen, die zu normalen Dateien führen, aber in diesem Fall würde das zu einer Überzählung führen.
  • -executablebewirkt, dass nur Dateien gefunden werden, die vom Benutzer, der ausgeführt wird, ausführbar sind find. Wenn Sie nicht ausführbare Dateien prüfen, um zu sehen, ob es sich um Shell- oder Python-Skripte handelt, dauert der Befehl erheblich länger. Auf diese Weise erhalten Sie möglicherweise auch mehr falsche Ergebnisse, da nicht ausführbare Dateien „Bibliotheken“ statt Skripte sein können, d. h. sie bestehen möglicherweise aus Shell-Befehlen und sind für die Einbindung mit .oder in Shell-Skripte vorgesehen, oder es handelt sich um Python-Module, die mit oder in Python-Programme sourceimportiert werden . (Sie denken vielleicht, dass dies nicht passieren würde, da solche Dateien im Allgemeinen keineimportfromsiebang, aber findes sieht nach mehr als einem Scheiß aus.) Sie können es jedoch weglassen, -executablewenn Sie möchten - undwenn Sie bereit sind zu wartenwährend Ihr Befehl versucht, den Anfang jeder regulären Datei auf Ihrem System zu öffnen und zu lesen.
  • -exec ... +führt einen Befehl ...mit den gefundenen Dateien als Befehlszeilenargumente aus. Der Befehl wird so oft ausgeführt, wie es nötig ist, um alle Dateien zu verarbeiten. Oft ist dies nur einmal; für alle ausführbaren Dateien auf Ihrem gesamten System wird es wahrscheinlich mehr als einmal ausgeführt, aber viel seltener, als wenn Sie es einmal pro Datei ausführen würden (wie es der -exec ... \;Fall wäre). Selbst bei der gleichen Anzahl von Dateien ist es tendenziell deutlich schneller, einen Befehl weniger oft auszuführen, als ihn mehrmalig auszuführen, da der damit verbundene Overhead geringer ist.
  • Der fileBefehl schaut sich den Anfang einer Datei an und errät, normalerweise ziemlich genau, um welche Art von Datei es sich handelt. Er gibt in einem zweispaltigen Format aus, mit dem Pfad oder Dateinamen auf der linken Seite und einer Zusammenfassung dessen, wasArtder Datei scheint es auf der rechten Seite zu sein.
  • Der grepBefehl filtert seine Eingabe und gibt nur Zeilen aus, die ohne Berücksichtigung der Groß- und Kleinschreibung ( -i) mit denerweiterter regulärer Ausdruck( -E) (python|shell) script,. Das sind die Zeilen, die den Text , oder eine beliebige Groß-/Kleinschreibung davon enthalten python script,. shell script,In Dateien, finddie als diese Skripttypen identifiziert wurden, wird dies angezeigt.
  • wc -l, das im zweiten der beiden oben gezeigten Befehle erscheint, zählt Zeilen.

Wie gezeigt ist diese Technik völlig ungeeignet fürvieleAufgaben, bei denen es darum geht, zu erkennen, über welchen Dateityp man verfügt.Dies liegt daran, dass der python script,Name einer Datei Text wie „+“ und auch Zeilenumbruchzeichen enthalten kann, die dazu führen würden, dass filenicht eins pro Zeile ausgegeben wird.Normalerweise ist es wichtig und oft sogar lebenswichtig, solche Dinge zu berücksichtigen, und es ist möglich.In diesem Fall jedoch ist es nur eine Schätzung (aufgrund der unklaren Natur des Problems selbst) und es sieht so aus, als würden Sie nichts umbenennen, ändern, löschen oder sogar direkt auf Grundlage des Ergebnisses erstellen. Daher denke ich nicht, dass es sich lohnt, sich darüber Gedanken zu machen. Wenn Sie dies am Ende iterieren und das Problem genauer definieren, könnte es sich lohnen, dies anzugehen.

Beachten Sie, dass es einen wichtigen Fall gibt, in dem Sie nicht ausführbare Dateien möglicherweise als Skripte betrachten möchten: Wenn Sie viele Python-Skripte von einem System wie Windows übernommen haben, wo sie nicht als ausführbar gekennzeichnet sind. In diesem Fall können Sie nach .pyDateien suchen, beachten Sie jedoch, dass viele davon wahrscheinlich Python-Module und keine Python-Skripte sind. Wenn die bewährte Python-Praxis, einen Hashbang an den Anfang des Skripts zu setzen, befolgt wurde (dies ist sogar unter Windows nützlich, da es sie py.exeerkennt pyw.exe, obwohl dies leider nicht immer getan wird), ist eine Technik, die nur nach Hashbangs sucht, aber ignoriert, ob eine Datei ausführbar ist, möglicherweise besser für Ihre Anforderungen geeignet.

Es gibt auch einen kleinen, aber wichtigen Fall, in dem Sie nicht ausführbare Dateien als Skripte jeglicher Art betrachten möchten – oder genauer gesagt, in dem Sie die Ausführbarkeit anders testen möchten. Wenn Sie ein Laufwerk gemountet haben noexec, besteht keine Datei darauf findden -executableTest. Beachten Sie, dass dies ein anderes Problem ist als die Ausführung findals Benutzer, der keine Berechtigung zum Ausführen bestimmter Dateien hat – wie das Problem der Ausführung als Benutzer, der keine Berechtigung zum Durchsuchen bestimmter Verzeichnisse hat, kann dies gelöst werden, indem Sie es als Benutzer mit ausreichenden Berechtigungen ausführen.


Dieses Problem,wie du es formuliert hast, ist ungewöhnlich--Normalerweise möchte man Schriften einer bestimmten Sprache oder einer kleinen Familie eng verwandter Sprachen finden. Beachten Sie jedoch zum Nutzen zukünftiger Leser, dass das Auffinden aller (beispielsweise) Shell-Skripte in einem einzigen, möglicherweise großen Verzeichnis auch mit einer geringfügigen Änderung der obigen Befehle erreicht werden kann. (Dasselbe gilt für die inAntwort von WinEunuuchs2Unix--auch dafür ist es nützlich.)

So finden Sie beispielsweise alle Shell-Skripte im aktuellen Verzeichnis:

find . -type f -executable -exec file {} + | grep -Fi 'shell script,'

Antwort2

Schneller Überblick

Hier finden Sie eine Anleitung dazu.

$ for f in * ; do file "$f" ; done

aptfielout: ASCII text, with very long lines
aptfilein: ASCII text, with very long lines
aptfileout: ASCII text
aptfileparse.sh: Bourne-Again shell script, ASCII text executable, with very long lines
aptfileparse.sh~: ASCII text, with very long lines
calc.py: Python script, UTF-8 Unicode text executable
catall.sh: Bourne-Again shell script, ASCII text executable

Entfernen Sie alle Dateien, die nicht als „Bourne-Again-Shell-Skript“ oder „Python-Skript“ gekennzeichnet sind. Fügen Sie der Liste folgende POSIX-Shell-Skripte hinzu:

$ file /bin/zgrep
/bin/zgrep: POSIX shell script, ASCII text executable

Eine vollständige Antwort

/$ time find * -type f -print0 2>/dev/null | xargs -0 -P 8 file | \
sed 's/.*: //g' | sed 's/^ *//g' | \
grep -Eio 'shell script,|Python script,' | sort | uniq -c  

  19151 Python script,                  
    127 python script,
  18420 shell script,

real    16m14.939s
user    54m7.355s
sys     2m33.238s

Beginnend bei der Wurzel ( /) werden findalle Dateien und die Pipe an den xargsBefehl als mit Null-Bytes abgeschlossene Namen weitergeleitet.

Der xargsBefehl wird parallel ausgeführt, wodurch alle 8 CPUs für eine schnellere Verarbeitung maximal ausgelastet werden. Jeder parallele Prozess ruft den fileBefehl auf, der eine Beschreibung der Datei abruft, wie im vorherigen Abschnitt gezeigt.

Der grepBefehl wählt Shell-Skripte und Python-Skripte aus.

Der sortBefehl sortiert Shell-Skripte zusammen und Python-Skripte zusammen.

Der uniqBefehl zählt die Vorkommen jeder Gruppe.


Wissenswertes

Sie können Ihr System wirklich belasten, indem Sie alle 8 CPUs (in meinem Fall) gleichzeitig ausführen:

finde xargs 8 cores.gif

Die Schönheit von Linux kommt zum Vorschein, weil andere Aufgaben wie der Bildschirmrekorder .gifund die Wiedergabe eines Videos auf dem dritten Monitor (Großbildfernseher) weiterhin normal funktionieren. Linux lässt nicht zu, dass der xargs fileBefehl das System verlangsamt.

verwandte Informationen