Effizientes Entfernen von x-Bit aus Dateien in großen Verzeichnissen

Effizientes Entfernen von x-Bit aus Dateien in großen Verzeichnissen

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 xargskö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 -execAktion 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 ... {} + -quitmy-command möglicherweise nicht ausgeführt. Diese Variante von -execgibt immer true zurück.

Antwort2

xargsUm das Laichen einzuschränken, verwenden Sie :

find /path/to/base/dir -type f -print0 | xargs -0 chmod -x

verwandte Informationen