Ich möchte alle PHP-Dateien auf meinem Server finden, deren erste oder zweite Zeile mehr als N Zeichen enthält.
Ich möchte sowohl den Dateinamen als auch den gefundenen Zeileninhalt ausdrucken.
Wie würde ich das machen? Ich denke darüber nach, grep zu verwenden, aber ich weiß nicht, wie ich damit Zeilen in einer Datei analysieren kann.
Antwort1
So geht's:
MIN_WIDTH=30
for f in $(find / -iname '*\.php'); do
if [ $(head -n 2 "$f" | tail -n 1 | wc -c) -gt $MIN_WIDTH ] || [ $(head -n 1 "$f" | wc -c) -gt $MIN_WIDTH ]; then
echo "$f";
fi
done
hier ist eine Aufschlüsselung:
- alle Dateien suchen
.php
:find / -regex '.*\.php$'
- Holen Sie sich die zweite Zeile der Datei und zählen Sie die Anzahl der Zeichen:
head -2 "$f" | tail -1 | wc -c
- Holen Sie sich die erste Zeile der Datei und zählen Sie die Anzahl der Zeichen:
head -1 "$f" | wc -c
- Vergleichen Sie, ob jeder größer als $MIN_WIDTH ist: `[ $(…) -gt $MIN_WIDTH ]
- wenn einer dieser Werte größer ist als
$MIN_WIDTH
:if […] | […]
- Drucken Sie den Namen der Datei aus:
echo "$f"
Antwort2
Eine etwas kürzere Variante als zmo's
find -iname "*.php" -exec grep -HP '.{6,}' {} \; | grep -P '^.+:[12]:'
wobei 6 die Mindestanzahl an Zeichen ist. Die -H
Option besteht darin, den Dateinamen auch dann auszugeben, wenn nur eine Datei gesucht wird (das ist der Fall, weil jede gefundene Datei einzeln über den {}
Operator gesucht wird).