Verwenden von „find“ mit dem Befehl „sh“ funktioniert nicht

Verwenden von „find“ mit dem Befehl „sh“ funktioniert nicht

Ich versuche, nach Dateien mit dem Muster zu suchen FW. In diesen gefilterten Dateien versuche ich nach dem Muster zu suchen chmod.*archive|archive.*chmodund 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 grepfür Ihr Muster in jeder von gefundenen Datei gesucht findund, wenn dies greperfolgreich 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:

  1. Lassen Sie findsich die Pfadnamen ausgeben:

    find . -name '*FW*' -type f \
        -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
    

    Dies wird grepfü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 -execAktionen hinzu).

  2. Lassen Sie grepsich die Pfadnamen ausgeben:

    find . -name '*FW*' -type f \
        -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
    

    Dies wird grepfür Stapel gefundener Dateien ausgeführt. Das grepDienstprogramm meldet die Pfadnamen aller übereinstimmenden Dateien mit der entsprechenden -lOption („dash-ell“).

    Dies wird wahrscheinlich schneller laufen, da es die Anzahl der grepAufrufe minimiert, und wäre das, was Sie tun würden, wenn Sie nursehenbei den Pfadnamen.

verwandte Informationen