![Verwenden von „find“ mit dem Befehl „sh“ funktioniert nicht](https://rvso.com/image/170306/Verwenden%20von%20%E2%80%9Efind%E2%80%9C%20mit%20dem%20Befehl%20%E2%80%9Esh%E2%80%9C%20funktioniert%20nicht.png)
Ich versuche, nach Dateien mit dem Muster zu suchen FW
. In diesen gefilterten Dateien versuche ich nach dem Muster zu suchen chmod.*archive|archive.*chmod
und sie dann aufzulisten.
Ich habe es mit dem folgenden Befehl versucht, aber er bringt nicht die gewünschte Ausgabe. Ich brauche Hilfe, um dieses Problem zu lösen.
find . -name '*FW*' -exec sh -c "cat {}|grep -iEq 'chmod.*archive|archive.*chmod'|ls" \;|more
Antwort1
Wenn ich das richtig verstehe, brauchen Sie nur:
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls
Dadurch wird grep
für Ihr Muster in jeder von gefundenen Datei gesucht find
und, wenn dies grep
erfolgreich ist, wird die Datei in einem ähnlichen Format wie aufgelistet ls -l
.
Antwort2
Als Alternative zu dem Vorschlag von @terdon könnten Sie wahrscheinlich auch den folgenden Befehl verwenden:
grep -iErl 'chmod.*archive|archive.*chmod' . | grep FW
BEARBEITEN
Wie @Kusalananda betont hat:
Dies würde fehlschlagen (eine falsche Ausgabe liefern), wenn es Übereinstimmungen in Dateien in Verzeichnissen gibt, deren Namen FW enthalten.
Wenn es richtig angepasst wird, ist es viel weniger lesbar. Die von @terdon vorgeschlagene Lösung ist eine günstigere Option (und auch effizienter – siehe Kommentar von @tedron).
Trotzdem hier eine korrigierte Version:
grep -iErl 'chmod.*archive|archive.*chmod' . | grep -E '[^/]*FW[^/]*$'
Antwort3
Um die Pfadnamen zu erhalten, die den Dateien entsprechen, deren Zeilen Ihrem Muster entsprechen, haben Sie zwei Möglichkeiten:
Lassen Sie
find
sich die Pfadnamen ausgeben:find . -name '*FW*' -type f \ -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
Dies wird
grep
für jede gefundene Datei einzeln ausgeführt und druckt dann die Pfadnamen für jede Datei aus, die Übereinstimmungen mit dem Muster enthält (das ich übrigens in einen standardkonformen Satz aus zwei separaten grundlegenden regulären Ausdrücken umgewandelt habe, da alles andere in der Antwort Standard war).Dies ist wahrscheinlich das, was Sie verwenden möchten, wenn Sie mit den Pfadnamen etwas anderes machen möchten, als sie nur im Terminal auszudrucken (fügen Sie einfach weitere
-exec
Aktionen hinzu).Lassen Sie
grep
sich die Pfadnamen ausgeben:find . -name '*FW*' -type f \ -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
Dies wird
grep
für Stapel gefundener Dateien ausgeführt. Dasgrep
Dienstprogramm meldet die Pfadnamen aller übereinstimmenden Dateien mit der entsprechenden-l
Option („dash-ell“).Dies wird wahrscheinlich schneller laufen, da es die Anzahl der
grep
Aufrufe minimiert, und wäre das, was Sie tun würden, wenn Sie nursehenbei den Pfadnamen.