Suchen Sie nur Dateien in einem Verzeichnis mit Berechtigungen, die unter Linux nicht auf 644 festgelegt sind

7

Dies ist meine erste Frage, obwohl ich schon eine Weile lauere.

Frage: Ich möchte find verwenden, um nur die Dateien in einem Verzeichnis mit Berechtigungen abzurufen, die nicht auf 644 (oder einen anderen Berechtigungswert) festgelegt sind. Gibt es eine kürzere Möglichkeit, dies zu schreiben, oder ist es die einzige Möglichkeit, nur die Optionen -perm und -or zu verwenden und jeden Berechtigungstyp außer 644 aufzulisten?

Dies ist Teil eines größeren Befehls, den ich beschleunigen wollte:

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

Ich hoffe, dass die Bereitstellung von xargs nur die Dateinamen, die aktualisiert werden müssen, es beschleunigen wird. Das Verzeichnis enthält ~ eine Million Dateien, aber nur ~ 10.000 müssen normalerweise aktualisiert werden. Ich denke, der Befehl ist langsam, weil er trotzdem alle Dateien weiterleitet. Vielleicht gibt es einen effizienteren Ansatz für den größeren Befehl. Lassen Sie mich wissen, wenn Sie einen kennen. Ich würde trotzdem gerne die Antwort auf diese Frage wissen. Übrigens kann ich die Berechtigungen nicht aktualisieren, bevor ich die Dateien zum Verzeichnis hinzugefügt habe.

M Brown
quelle
Der Befehl wird in <2 Sekunden ausgeführt, bevor er länger als 5 Minuten gedauert hat. Dies ist also eine viel bessere Methode, obwohl ich nie Beispiele sehe, die dies auf diese Weise tun. Vielen Dank an alle. finde / path / to / dir / -type f! -perm 0644 -print0 | xargs -0 chmod 644
M Brown

Antworten:

17

Der !Operator gibt true zurück, wenn eine Bedingung false ist.

Während also -perm 0644Dateien mit festgelegten rw-r - r---Berechtigungen ! -perm 0644übereinstimmen , stimmt dies mit denen überein, die diese Berechtigungen nicht haben.

Der Befehl, den Sie benötigen, lautet:

find /path/to/dir/ -type f ! -perm 0644 -print0 | xargs -0 chmod 644
Kenny Rasschaert
quelle
2
Das funktioniert super. Das ! Flagge war genau das, was ich brauchte. Die Abfrage erfolgt jetzt fast sofort, anstatt ~ 5 Minuten zu dauern. Ich sehe es jetzt in der Man-Datei unten erwähnt.
M Brown
3
  find /path/to/dir ! -perm 0644 

Und

    find /path/to/dir ! -perm 0644 -exec chmod 0644 {} \;
Jaspis
quelle
/ path / to / dir muss vor dem! stehen.
Matthew Flaschen
Dies funktioniert auch, aber aus irgendeinem Grund ist -exec langsamer als das Weiterleiten an xargs, da es sich um ein großes Verzeichnis handelt. -exec führt möglicherweise einzelne Befehle aus, anstatt wie xargs zu stapeln?
M Brown
2
@M Brown, versuchen Sie es in Zukunft +anstelle von \;. Das macht die gleiche Art von Batching wie xargs.
Matthew Flaschen
3

Zumindest mit GNU find kannst du das! Operator für Negation mit -perm. Zum Beispiel:

find /path/to/dir ! -perm 644

Möchten Sie anhand des Beispiels, das Sie geben, nur sicherstellen, dass die Eigentümer mindestens gelesen / geschrieben haben und jeder mindestens gelesen hat? Wenn ja, dann können Sie es einfach mit chmod tun:

chmod -R a+r,u+w /path/to/dir/*
Andy Simmons
quelle
Das ! Betreiber ist das, was mir gefehlt hat. Ich muss find verwenden und dann wegen der großen Anzahl von Dateien im Verzeichnis an xargs weiterleiten. chmod kann die Anzahl der Dateien nicht verarbeiten.
M Brown
2

Eine mögliche Lösung wäre, wenn Sie weniger Verzeichnisse haben, a ausführen chmod -R 644 /path/to/dirund dann a ausführen find /path/to/dir -type d -exec chmod 755 {} \;.

Warner
quelle
Es gibt keine Verzeichnisse, nur Dateien. Ich benutze xargs wegen der großen Anzahl von Dateien.
M Brown