
Ich versuche derzeit, alle Dateien mit Erweiterungen .html
im aktuellen Verzeichnis und allen Unterverzeichnissen so einzustellen, dass sie von ihrem Besitzer gelesen , geschrieben und ausgeführt werden können und nur von Gruppen und anderen gelesen (nicht geschrieben oder ausgeführt) werden können. Einige der Dateien enthalten jedoch Leerzeichen im Namen, und ich bin mir nicht sicher, wie ich damit umgehen soll.
Mein erster Versuch:
chmod -Rv u+rw,go+r '* *.html'
Bei meinem ersten Versuch erhalte ich folgende Meldung:
chmod: cannot access '* *.html': No such file or directory
failed to change mode of '* *.html' from 0000 (---------) to 0000 (---------)
Mein zweiter Versuch:
find . -type f -name "* *.html" | chmod -Rv u+rw,go+r
Ich habe einen Pipe-Operator hinzugefügt, um die find
Ausgabe des Befehls an zu senden chmod
. Bei meinem zweiten Versuch erhielt ich jedoch Folgendes:
chmod: missing operand after ‘u+rw,go+r’
Nach meinen Versuchen bin ich immer noch verwirrt, wie ich mit Leerzeichen in Dateinamen umgehen soll, um festgelegte Berechtigungen rekursiv zu ändern. Wie gehe ich am besten mit diesem Problem um? Jedes Feedback oder jeder Vorschlag ist willkommen.
Antwort1
Verwenden Sie das -exec
Prädikat von find
:
find . -name '* *.html' -type f -exec chmod -v u+rw,go+r {} +
(Hier werden rw-r--r--
nur Berechtigungen hinzugefügt, da es wenig Sinn macht, einer HTML-Datei Ausführungsberechtigungen hinzuzufügen, da diese im Allgemeinen nicht zur Ausführung gedacht sind. Ersetzen Sie +
durch =
toSatzdiese Berechtigungen genau stattHinzufügendiese Bits zu den aktuellen Berechtigungen).
Sie können auch ! -perm -u=rw,go=r
vor dem ein hinzufügen -exec
, um die Dateien zu überspringen, die bereits (mindestens) diese Berechtigungen haben.
Mit demsfind
Implementierung vonfind
(das ist auch das find
eingebaute vondie bosh
Muschel) können Sie das -chmod
Prädikat gefolgt von -chfile
(das die Änderungen anwendet) verwenden:
sfind . -name '* *.html' -type f -chmod u+rw,go+r -chfile
! -perm...
(dort ist es nicht nötig, „ as sfind
“ hinzuzufügen, -chfile
da dadurch die Dateien übersprungen werden, die bereits über die richtigen Berechtigungen verfügen).
Diese Methode ist am effizientesten, da nicht chmod
für jede beliebige Anzahl von Dateien ein separater Befehl in einem neuen Prozess ausgeführt werden muss und auch, weil so vermieden wird, dass der vollständige Pfad jeder Datei zweimal nachgeschlagen werden muss ( sfind
ruft den chmod()
Systemaufruf mit den Pfaden der Dateien relativ zu den Verzeichnissen auf sfind
und findet sie beim Crawlen, d. h., chmod()
es müssen nicht alle Pfadkomponenten, die zu ihnen führen, erneut nachgeschlagen werden).
Mit zsh
:
chmod -v -- u+rw,go+r **/*' '*.html(D.)
Hier wird das rekursive Globbing der Shell und das D
und verwendet.
Glob-Qualifikationum versteckte Dateien einzuschließen bzw. zu beschränken aufregulärDateien (wie -type f
). Hinzufügen ^f[u+rw,go+r]
, um auch Dateien zu überspringen, die bereits diese Berechtigungen haben.
Sie können dafür keine chmod
's in Kombination mit Globs verwenden. Globs werden von der Shell erweitert, nicht von abgeglichen , also übergeben Sie mit (beachten Sie, dass diese ohne Anführungszeichen bleiben müssen, damit die Shell sie als Globbing-Operatoren interpretiert) einfach eine Liste von Dateien an und nur wenn eine dieser Dateien ein Verzeichnis wäre, würde chmod rekursiv in sie eingreifen und die Berechtigungen aller Dateien darin ändern.-R
chmod
chmod -Rv ... *' '*.html
*
html
chmod
Antwort2
„Dateinamen mit Leerzeichen“ erfordert find
und xargs
. Lesen Sie man find xargs
und führen Sie etwas aus wie:
find . -type f -name '*.html' -print0 | \
xargs -0 -r echo chmod u=rwx,g=r,o
Entfernen Sie " echo
", wenn es für Sie funktioniert.