Im Anschluss an die zuvor gepostete Anfrage Verwenden von „find“ mit dem Befehl „sh“ funktioniert nicht
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls
Dieser Befehl konnte die Dateien nicht finden, wenn der Text „archive“ oder „chmod“ in mehreren Zeilen vorkommt. Er kann die Dateien jedoch scannen, wenn der Text „chmod“ und „archive“ in derselben Zeile vorkommt.
Habe es also mit diesem Befehl versucht, aber es gibt nicht das gewünschte Ergebnis
1> find . -type f -name '*FW*' -exec grep -iEq 'chmod.*' {} \; -ls -exec grep -iEq '.*archive.*' {} +
Warum liefert dieser Befehl nicht das gewünschte Ergebnis?
Habe es mit diesem Befehl versucht, es gibt das erwartete Ergebnis, aber es schlägt zeitweise mit diesem Fehler fehl: „find: ‚pcregrep‘ beendet durch Signal 11“
2> find . -type f -name '*FW*' -exec pcregrep -qM 'chmod.*(\n|.)*archive.*' {} \; -ls
Warum tritt dieser Fehler auf?
Antwort1
Ihr zweiter Befehl in der Frage gibt Ihnen nicht die richtige Ausgabe, da die Reihenfolge der Tests, die Sie verwenden, find
wichtig ist. Der Befehl gibt nur Ergebnisse für Dateien aus, die die chmod
Zeichenfolge enthalten, da der andere grep
Befehl ausgeführt wirdnach -ls
(und erzeugt keine Ausgabe).
Sie möchten Dateien finden, die sowohl die Zeichenfolgen chmod
als auch enthalten archive
.
find . -type f -name '*FW*' \
-exec grep -Fiq chmod {} \; \
-exec grep -Fiq archive {} \; -ls
Dies ruft grep -Fiq chmod
alle Dateien auf, die FW
in ihrem Namen haben, und dann grep -Fiq archive
diejenigen, in denen die erste grep
eine Übereinstimmung gefunden hat. Wenn die zweite grep
auch etwas gefunden hat, -ls
wird das wirksam.