Weiterleitung der Ausgabe des Find-Befehls

Weiterleitung der Ausgabe des Find-Befehls

Als Antwort auf meine gepostete Anfrage - Verwenden von „find“ mit dem Befehl „sh“ funktioniert nicht

Basierend auf dem Ausgabewert des folgenden Befehls muss ich die Berechtigung für jede der aufgelisteten Dateien auf 777 aktualisieren.

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls

Gibt es eine Möglichkeit, die Ausgabe weiterzuleiten chmodund die Dateiberechtigungen zu aktualisieren?

Antwort1

Sie können ein weiteres hinzufügen, -execdas auf die Dateien findangewendet werden soll . Entfernen Sie es , wenn Sie es nicht benötigen:chmod-ls

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \;\
  -ls -exec chmod 777 {} +

Antwort2

Sie können -execam Ende einen weiteren hinzufügen, um die Berechtigungen für die Dateien zu aktualisieren, die die vorherigen Tests bestanden haben.wie Freddys Shows, oder Sie können grepund chmodin einem Inline- sh -cSkript kombinieren:

find . -type f -name '*FW*' -exec sh -c '
    for pathname do
        if grep -q -i -e "chmod.*archive" -e "archive.*chmod" "$pathname"
        then
            chmod 777 "$pathname"
        fi
    done' sh {} +

Dies würde findals eine Art Generator von Pfadnamen für die Schleife im sh -cSkript dienen.

Diese Schleife nimmt alle dem Inline-Skript übergebenen Pfadnamen, testet jeden mit grepund wenn das Muster mit einer Datei übereinstimmt, werden die Berechtigungen dieser Datei (möglicherweise) aktualisiert.


In bashkönnen Sie statt der Pfadnamen durch findein Globbing-Muster für Dateinamen verwenden:

shopt -s globstar nullglob dotglob

for pathname in ./**/*FW*; do
    if [ -f "$pathname" ] && grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' "$pathname"
    then
        chmod 777 "$pathname"
    fi
done

Der einzige sichtbare Unterschied besteht darin, dass hierdurch auch symbolische Links verarbeitet werden, die dem Muster entsprechen.

Die globstarShell-Option aktiviert das **Muster, das rekursiv in Unterverzeichnisse passt. Die nullglobShell-Option lässt nicht übereinstimmende Muster verschwinden, anstatt unerweitert zu bleiben. Die dotglobShell-Option sorgt dafür, dass Muster mit versteckten Namen übereinstimmen.

In der zshShell kann dies verkürzt werden auf

for pathname in ./**/*FW*(.ND); do
    if grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' $pathname
    then
        chmod 777 $pathname
    fi
done

... wobei ., Nund wiederum Ddem -fTest (aber nicht mit symbolischen Links übereinstimmend), der Einstellung nullglobund der Einstellung dotglobin entsprechen.bash

verwandte Informationen