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
Antworten:
Eine
find -exec
Antwort 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. Mitxargs
Willen 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
xargs
Dateinamen 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
find
undxargs
Implementierung):Die
-print0
Ursachen,find
um die Dateinamen in seinem Ausgabestream mit einem NUL-Zeichen (anstelle eines Leerzeichens) zu beenden, und die Ursachen , die-0
daraufxargs
hinweisen, dass dies als Eingabeformat zu erwarten ist.quelle
chmod
haben, ist das kein Problem.xargs
stapelt die Dinge intelligent auf.xargs
bereits Dateien, damit sie das Argumentlängenlimit nicht überschreiten. Die-n/-L
Optionen erlauben einfach weitere willkürliche Grenzen für die Chargengröße.Eine andere Möglichkeit, dies zu tun, besteht darin,
find ... -exec ...
Folgendes zu verwenden:Das Problem ist, dass für jede Datei
-exec
einchmod
Prozess gestartet wird. Derxargs
Ansatz vermeidet dies und ist überlegen, vorausgesetzt, Sie haben eine Version vonfind
undxargs
kö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.
quelle
+
?;
und+;
. Der Backslash entweicht der Shell.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`
quelle
über http://www.linuxquestions.org/questions/aix-43/chmod-recursion-files-only-208798/?s=a70210fb5e5d0aa7d3c69d8e8e64e3ed
quelle
mit GNU finden
find /path -type f -exec chmod 644 {} +;
quelle