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 find
Befehl als Root ausführen sudo
, wenn Sie das wirklich möchten.
-type f
bewirkt, dass nur normale Dateien gefunden werden. Normalerweise ist es besser,-xtype f
symbolische Links einzuschließen, die zu normalen Dateien führen, aber in diesem Fall würde das zu einer Überzählung führen.-executable
bewirkt, dass nur Dateien gefunden werden, die vom Benutzer, der ausgeführt wird, ausführbar sindfind
. 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-Programmesource
importiert werden . (Sie denken vielleicht, dass dies nicht passieren würde, da solche Dateien im Allgemeinen keineimport
from
siebang, aberfind
es sieht nach mehr als einem Scheiß aus.) Sie können es jedoch weglassen,-executable
wenn 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
file
Befehl 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
grep
Befehl 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 enthaltenpython script,
.shell script,
In Dateien,find
die 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 file
nicht 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 .py
Dateien 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.exe
erkennt 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 find
den -executable
Test. Beachten Sie, dass dies ein anderes Problem ist als die Ausführung find
als 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 find
alle Dateien und die Pipe an den xargs
Befehl als mit Null-Bytes abgeschlossene Namen weitergeleitet.
Der xargs
Befehl wird parallel ausgeführt, wodurch alle 8 CPUs für eine schnellere Verarbeitung maximal ausgelastet werden. Jeder parallele Prozess ruft den file
Befehl auf, der eine Beschreibung der Datei abruft, wie im vorherigen Abschnitt gezeigt.
Der grep
Befehl wählt Shell-Skripte und Python-Skripte aus.
Der sort
Befehl sortiert Shell-Skripte zusammen und Python-Skripte zusammen.
Der uniq
Befehl 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:
Die Schönheit von Linux kommt zum Vorschein, weil andere Aufgaben wie der Bildschirmrekorder .gif
und die Wiedergabe eines Videos auf dem dritten Monitor (Großbildfernseher) weiterhin normal funktionieren. Linux lässt nicht zu, dass der xargs file
Befehl das System verlangsamt.