
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 chmod
und die Dateiberechtigungen zu aktualisieren?
Antwort1
Sie können ein weiteres hinzufügen, -exec
das auf die Dateien find
angewendet 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 -exec
am 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 grep
und chmod
in einem Inline- sh -c
Skript 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 find
als eine Art Generator von Pfadnamen für die Schleife im sh -c
Skript dienen.
Diese Schleife nimmt alle dem Inline-Skript übergebenen Pfadnamen, testet jeden mit grep
und wenn das Muster mit einer Datei übereinstimmt, werden die Berechtigungen dieser Datei (möglicherweise) aktualisiert.
In bash
können Sie statt der Pfadnamen durch find
ein 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 globstar
Shell-Option aktiviert das **
Muster, das rekursiv in Unterverzeichnisse passt. Die nullglob
Shell-Option lässt nicht übereinstimmende Muster verschwinden, anstatt unerweitert zu bleiben. Die dotglob
Shell-Option sorgt dafür, dass Muster mit versteckten Namen übereinstimmen.
In der zsh
Shell 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 .
, N
und wiederum D
dem -f
Test (aber nicht mit symbolischen Links übereinstimmend), der Einstellung nullglob
und der Einstellung dotglob
in entsprechen.bash