Mit GNU oder FreeBSD oder NetBSD oder OpenBSD (und möglicherweise anderen) awk
:
find . -type f -exec awk '
/^#!.*python/{print FILENAME}
{nextfile}' {} +
Würde nur in die erste Zeile jeder Datei schauen und so wenig awk
s wie nötig ausführen .
Die nextfile
obige Aussage ist kein Standard, findet sich jedoch in einigen Implementierungen, einschließlich der GNU (von der sie wahrscheinlich stammt).
Während der obige Code auch in anderen Implementierungen zu funktionieren scheint, würde die nextfile
Anweisung dort nichts tun (würde als Ausdruck erkannt werden, der aus einer nicht gesetzten nextfile
Variablen besteht), was bedeuten würde, dass alle Dateien vollständig gelesen würden und der Dateiname würde für jede passende Zeile gedruckt werden.
Wenn Ihre awk
Unterstützung FNR
(wie POSIX awks, aber nicht das Original awk
, also unter Solaris /usr/xpg4/bin/awk
und nicht /usr/bin/awk
) und nicht nextfile
, können Sie es schreiben:
find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} +
Was immer noch so wenig awk
s wie möglich laufen würde, aber die Dateien vollständig lesen würde.
Eine weitere Alternative zu vermeiden , dass die Dateien vollständig zu lesen und das würde mit jedem arbeiten awk
und find
aber würde bedeuten , läuft eine awk
pro Datei wäre:
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print
grep -l
Lesen einer Datei zwar keine Übereinstimmung gefunden wird, bei Dateien ohne Übereinstimmung jedoch die gesamte Datei gelesen wird. Es würde auch Übereinstimmungen in der Mitte von Dateien finden, so dass es beispielsweise mit einershar
Datei übereinstimmen könnte , die Python-Skripte enthält.