Ich habe ein Verzeichnis /some/dir, das Millionen von Dateien und Verzeichnissen enthält. Ich muss das X-Bit für alle Dateien entfernen, aber nicht aus den Verzeichnissen.
Folgende Werke:
find /some/dir -type f -chmod -x {} \;
Ich glaube aber, dass für jede Datei ein „chmod“-Prozess gestartet wird. Das könnte erklären, warum es so lange läuft.
Gibt es eine Möglichkeit, dies effizienter zu tun?
Antwort1
Außerdem xargs
können Sie, wie Ljm Dullaart erwähnte, Folgendes verwenden:
find /some/dir -type f -exec chmod -x {} +
Als Debug-Trick können Sie den generierten Befehl mit folgendem Befehl anzeigen:
find /some/dir -type f -exec echo chmod -x {} +
Aus der Manpage vonfinden(1)Befehl:
-exec command {} +
Diese Variante der-exec
Aktion führt den angegebenen Befehl für die ausgewählten Dateien aus, die Befehlszeile wird jedoch durch Anhängen jedes ausgewählten Dateinamens am Ende erstellt. Die Gesamtzahl der Aufrufe des Befehls ist wesentlich geringer als die Anzahl der übereinstimmenden Dateien. Die Befehlszeile wird auf die gleiche Weise erstellt wie die Befehlszeilen von xargs.{}
Innerhalb des Befehls ist nur eine Instanz von zulässig und diese muss am Ende direkt vor dem stehen+
. Sie muss maskiert (mit einem\
) oder in Anführungszeichen gesetzt werden, um sie vor der Interpretation durch die Shell zu schützen. Der Befehl wird im Startverzeichnis ausgeführt. Wenn ein Aufruf mit der+
Form einen von Null verschiedenen Wert als Beendigungsstatus zurückgibt, gibt find einen von Null verschiedenen Beendigungsstatus zurück. Wenn find auf einen Fehler stößt, kann dies manchmal zu einem sofortigen Beenden führen, sodass einige ausstehende Befehle möglicherweise überhaupt nicht ausgeführt werden. Aus diesem Grund wird-exec my-command ... {} + -quit
my-command möglicherweise nicht ausgeführt. Diese Variante von-exec
gibt immer true zurück.
Antwort2
xargs
Um das Laichen einzuschränken, verwenden Sie :
find /path/to/base/dir -type f -print0 | xargs -0 chmod -x