Ändern von chmod für Dateien, aber nicht für Verzeichnisse


72

Ich muss chmod verwenden, um alle Dateien rekursiv auf 664 zu ändern. Ich möchte die Ordner überspringen. Ich dachte daran, so etwas zu tun

ls -lR | grep ^-r | chmod 664

Das funktioniert nicht, nehme ich an, weil ich nicht in chmod pfeifen kann. Kennt jemand einen einfachen Weg, dies zu tun?

Vielen Dank


1
Dies sollte in ServerFault
MoshiBin

chmod sollte wirklich in der Lage sein, selbst zwischen Dateien, Links und Ordnern zu unterscheiden.
Xeoncross

Antworten:


113

Eine find -execAntwort ist gut, leidet jedoch unter dem normalerweise irrelevanten Mangel, dass für jede einzelne Datei ein separater Unterprozess erstellt wird. Es ist jedoch perfekt funktionsfähig und funktioniert nur dann schlecht, wenn die Anzahl der Dateien sehr groß wird. Mit xargsWillen Batch auf die Dateinamen in große Gruppen vor einem Teilprozess für die laufende Gruppe von Dateien.

Sie müssen nur darauf achten, dass Sie bei der Verwendung xargsDateinamen mit eingebetteten Leerzeichen, Zeilenumbrüchen oder anderen Sonderzeichen richtig behandeln.

Eine Lösung, die diese beiden Probleme löst, ist (vorausgesetzt, Sie haben eine anständige findund xargsImplementierung):

find . -type f -print0 | xargs -0 chmod 644

Die -print0Ursachen, findum die Dateinamen in seinem Ausgabestream mit einem NUL-Zeichen (anstelle eines Leerzeichens) zu beenden, und die Ursachen , die -0darauf xargshinweisen, dass dies als Eingabeformat zu erwarten ist.


Dies ist großartig für GNU find, aber leider sind -print0 und xargs -0 nicht Standard und funktionieren zB unter Solaris nicht. Verwenden Sie in diesem Fall eine der anderen Lösungen.
Mark4o

2
Ich kann bestätigen, dass diese Methode unter Mac OSX funktioniert (mindestens 10.9).
Anthony F

@ mark4o, Sie können nicht nur die mit Solaris gelieferten Braindead-Versionen verwenden. Ein großer Vorteil von FOSS ist, dass Sie es auf jedes nahe genug (UNIXy) Betriebssystem portieren können. Ich habe das häufig für AIX pro Version 5L gemacht.
Paxdiablo

1
Wenn Sie zu viele Argumente chmodhaben, ist das kein Problem. xargsstapelt die Dinge intelligent auf.
Paxdiablo

1
@codeforester stapelt xargs bereits Dateien, damit sie das Argumentlängenlimit nicht überschreiten. Die -n/-LOptionen erlauben einfach weitere willkürliche Grenzen für die Chargengröße.
Paxdiablo

31

Eine andere Möglichkeit, dies zu tun, besteht darin, find ... -exec ...Folgendes zu verwenden:

find . -type f -exec chmod 644 {} \;

Das Problem ist, dass für jede Datei -execein chmodProzess gestartet wird. Der xargsAnsatz vermeidet dies und ist überlegen, vorausgesetzt, Sie haben eine Version von findund xargskönnen das Problem "Leerzeichen in Pfadnamen" bewältigen. siehe die akzeptierte Antwort.

Und für den Datensatz wird die Verwendung von Back-Ticks unterbrochen, wenn zu viele Dateien zum Ändern vorhanden sind oder die aggregierte Länge der Pfadnamen zu groß ist.


1
Was ist der Unterschied zwischen \ und +?
Wie Chen

2
Eigentlich ... ist es der Unterschied zwischen ;und +;. Der Backslash entweicht der Shell.
Stephen C

18

Meine prägnanten zwei Cent ...

Linux:

$ chmod 644 `find -type f`

OSX:

$ chmod 644 `find . -type f`

Auf diese Weise werden alle im aktuellen Verzeichnis und in allen Unterverzeichnissen enthaltenen Dateien rekursiv geändert. Wenn Sie auf ein anderes Verzeichnis abzielen möchten, ersetzen Sie es .durch den richtigen Pfad:

$ chmod 644 `find /home/my/special/folder -type f`

Wie geben Sie welches Verzeichnis an?
tq

1
Meine ursprüngliche Antwort umfasste das, wonach das OP gefragt hatte: rekursives Ändern aller Dateien im aktuellen Verzeichnis. In meiner Bearbeitung erfahren Sie, wie Sie dies auf ein beliebiges Verzeichnis anwenden können, nicht nur auf das aktuelle.
Arman H.

2
Vielen Dank für die einfachste und kürzeste Lösung
Asherrard

3
Schlägt für mich bei Namen mit Leerzeichen fehl (Mac OS + Bash).
Mat Gessel


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.