2009-07-22 8 views
53

Ich muss Chmod verwenden, um alle Dateien rekursiv auf 664 zu ändern. Ich möchte die Ordner überspringen. Ich dachte anÄndern chmod für Dateien, aber nicht Verzeichnisse

ls -lR | grep ^-r | chmod 664 

so etwas wie dies tun dies nicht funktioniert, ich gehe davon aus, weil ich nicht über die Pipeline in chmod jemand eine einfache Möglichkeit, wissen dies zu tun?

Dank

+1

Dies sollte in ServerFault gefragt werden – MoshiBin

+0

wirklich chmod sollte zwischen Dateien, Links und Ordner auf seiner eigenen unterscheiden können. – Xeoncross

Antwort

82

Eine find -exec Antwort ist eine gute, aber sie leidet unter dem normalerweise irrelevanten Mangel, dass sie einen separaten Unterprozess für jede einzelne Datei erstellt. Allerdings ist es perfekt funktional und funktioniert nur schlecht, wenn die Anzahl der Dateien wirklich groß ist. Die Verwendung von xargs wird die Dateinamen in große Gruppen aufteilen, bevor ein Unterprozess für diese Gruppe von Dateien ausgeführt wird.

Sie müssen nur darauf achten, dass Sie bei der Verwendung von xargs Dateinamen mit eingebetteten Leerzeichen, Zeilenumbrüchen oder anderen Sonderzeichen korrekt verarbeiten.

Eine Lösung, die beide diese Probleme lösen, ist (vorausgesetzt, Sie ein anständiges genug find und xargs Implementierung):

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

Die -print0find Ursachen der Dateinamen auf seinem Ausgangsstrom mit einem NUL-Zeichen zu beenden (statt ein Leerzeichen) und die -0 bis xargs lässt wissen, dass es das als Eingabeformat erwarten sollte.

+0

Dies ist großartig für GNU finden, aber leider-print0 und xargs-0 sind nicht Standard und funktionieren nicht, z. auf Solaris. Verwenden Sie in diesem Fall eine der anderen Lösungen. – mark4o

+1

Ich kann bestätigen, dass diese Methode auf Mac OSX (mindestens 10.9) funktioniert. –

+0

@ mark4o, Sie können nicht nur die braindead-Versionen von Solaris verwenden. Ein großer Vorteil von FOSS ist, dass Sie es auf jedes beliebige (UNIXy) Betriebssystem portieren können. Ich habe das häufig für AIX per-Version-5L gemacht. – paxdiablo

27

Ein anderer Weg, dies zu tun ist find ... -exec ... wie folgt zu verwenden:

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

Das Problem ist, dass die -exec einen für jede Datei chmod Prozess beginnt. Der xargs Ansatz vermeidet dies und ist besser, vorausgesetzt, Sie haben eine Version von find und xargs, die mit dem Problem "Leerzeichen in Pfadnamen" umgehen können; Siehe die akzeptierte Antwort.

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

+1

Was ist der Unterschied zwischen \ und '+'? –

+2

@HowChen - Lesen Sie "Mann finden". –

+2

Eigentlich ... ist es der Unterschied zwischen ';' und '+;'. Der Backslash ist Shell-Escaping. –

2

mit GNU

find /path -type f -exec chmod 644 {} +;

13

Mein knappen zwei Cent finden ...

Linux:

$ chmod 644 `find -type f` 

OSX:

$ chmod 644 `find . -type f` 

Dies funktioniert rekursiv alle Dateien im aktuellen Verzeichnis und alle seine Unterverzeichnisse enthalten ändern. Wenn Sie ein anderes Verzeichnis ausrichten möchten, ersetzen . mit dem richtigen Pfad:

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

Wie geben Sie an, welches Verzeichnis? –

+1

Meine ursprüngliche Antwort bezog sich auf das, worum das OP gebeten hatte: rekursiv alle Dateien im aktuellen Verzeichnis zu ändern. Siehe meine Bearbeitung, wie man dies auf ein beliebiges Verzeichnis anwendet, nicht nur auf das aktuelle Verzeichnis. –

+1

Vielen Dank für die einfachste und kürzeste Lösung – asherrard