Wie ändere ich die Berechtigungen für einen Ordner und alle seine Unterordner und Dateien in einem Schritt unter Linux? [geschlossen]

1806

Ich möchte die Berechtigungen eines Ordners und aller seiner Unterordner und Dateien in einem Schritt (Befehl) unter Linux ändern.

Ich habe den folgenden Befehl bereits ausprobiert, aber er funktioniert nur für den genannten Ordner:

chmod 775 /opt/lampp/htdocs

Gibt es eine Möglichkeit zu setzen chmod 755für /opt/lampp/htdocsund alle ihre Inhalte , einschließlich Unterordner und Dateien?

htdocsWie können die Berechtigungen in Zukunft automatisch festgelegt werden, wenn ich in Zukunft einen neuen Ordner oder eine neue Datei darin erstelle 755?

Ich habe mir auch diesen Link angesehen:

http://stackoverflow.com/questions/3740187/how-to-set-default-chmod-in-linux-terminal

Adam
quelle
4
Wolltest du schreiben chmod 75 /opt/lampp/htdocsoder sollte das wirklich so sein chmod 755 /opt/lampp/htdocs?
HelloGoodbye
233
Die Tatsache, dass die vierthöchste Frage zu Linux "als Off-Topic geschlossen" ist, ist komisch. Wer außer einem Programmierer würde sich für chmod interessieren? Wie ist das nicht zum Thema? Warum sind "Berechtigungen", "Ordner" und "cmod" sogar Tags, wenn sie nicht zum Thema gehören?
Arthur Dent
8
@ArthurDent, da diese Frage (obwohl sie vollkommen gültig und hilfreich ist) eher für eine systemorientierte SE-Site wie SuperUser oder ServerFault geeignet ist. Es ist nicht ausdrücklich mit der Programmierung verbunden.
Timelmer
26
@ Timelmer Sicher, aber ich frage noch einmal, warum sind "Berechtigungen", "Ordner" und "cmod" Tags? Wann würde cmod jemals "ausdrücklich" für die Programmierung verwendet werden?
Arthur Dent
9
Wenn Sie wirklich wählerisch werden möchten, ist Bash eigentlich eine Skriptsprache, aber auch PHP, was SO nichts auszumachen scheint.
Timelmer

Antworten:

2957

Die anderen Antworten sind korrekt, da chmod -R 755diese Berechtigungen für alle Dateien und Unterordner in der Baumstruktur festgelegt werden. Aber warum um alles in der Welt willst du das ? Es mag für die Verzeichnisse sinnvoll sein, aber warum sollte das Ausführungsbit für alle Dateien gesetzt werden?

Ich vermute, was Sie wirklich tun möchten, ist, die Verzeichnisse auf 755 zu setzen und entweder die Dateien in Ruhe zu lassen oder sie auf 644 zu setzen. Hierfür können Sie den findBefehl verwenden. Zum Beispiel:

So ändern Sie alle Verzeichnisse in 755 ( drwxr-xr-x):

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

So ändern Sie alle Dateien in 644 ( -rw-r--r--):

find /opt/lampp/htdocs -type f -exec chmod 644 {} \;
WombleGoneBad
quelle
231
Möchte jemand erklären, was {} \;die Zeile am Ende bedeutet?
Nilzor
307
@Nilzor chmod 644 {} \;gibt den Befehl an, der von findfür jede Datei ausgeführt wird . {}wird durch den Dateipfad ersetzt, und das Semikolon kennzeichnet das Ende des Befehls (maskiert, andernfalls würde es von der Shell anstelle von interpretiert find).
Tobbez
25
"aber warum das Ausführungsbit für alle Dateien setzen" Warum nicht? Ich bin neu in Ubuntu / Linux ...
FlavorScape
12
@FlavorScape Womble setzt das Ausführungsbit ausschließlich für die von find zurückgegebenen Verzeichnisse. Mit der Ausführungsberechtigung für ein Verzeichnis kann eine Benutzerklasse den Inhalt dieses Verzeichnisses auflisten und in dieses Verzeichnis cd. Im Allgemeinen möchten Sie, dass sowohl r als auch x in einem Verzeichnis für Sie zugänglich sind, auch wenn es seltsame Randfälle gibt, in denen Sie nur das eine oder das andere festlegen würden. Weitere Informationen finden Sie in diesem Handbuch: nixsrv.com/llthw/ex23
Alexandr Kurilin
25
Mit Ausnahme von sleepynate wurde bei jeder Antwort der Aspekt seiner Frage bezüglich der Festlegung von Berechtigungen für zukünftig erstellte Dateien / Ordner vernachlässigt .
JGarrido
781

Aktivieren Sie die Option -R

chmod -R <permissionsettings> <dirname>

In Zukunft können Sie viel Zeit sparen, indem Sie zuerst die Manpage überprüfen:

man <command name>

Also in diesem Fall:

man chmod
Steve Robillard
quelle
147
was ist das man?
Adam
36
Es steht für Manual Page und ist ein Linux-Befehl, der die Manpage für einen Befehl anzeigt (die meisten Linux-Befehle haben eine Manpage). versuchen Sie es mit Mann oder Mann.
Steve Robillard
8
Dies funktionierte bei mir im Terminal unter Mac OS X nicht. Dort habe ich "chmod -R <permissionsettings> <dirname> *" ausgeführt und es hat funktioniert.
Einar Ólafsson
127
Ich denke, mittlerweile ist es tatsächlich schneller, hier zu posten oder Google zu verwenden, als zu verwenden man. Insbesondere für Fälle, in grepdenen Sie noch mankeine Erfahrung haben, kann es sehr zeitaufwändig sein, Beispiele im Dokument zu finden. Google oder SO stellen jedoch Beispiele innerhalb von Sekunden zur Verfügung.
ely
17
Für die Aufzeichnung, diejenigen, die nicht mit Linux vertraut sind, sind möglicherweise nicht mit dem Menschen vertraut. Ich weiß nur von seiner Existenz, aber um herauszufinden, wie man es benutzt, wäre ein Google-Abenteuer an und für sich erforderlich. Möglicherweise ein lohnendes Unterfangen, aber Sie sollten sich darüber im Klaren sein, dass ich DIESEN SEHR Beitrag über Google gefunden habe und er die GENAUE Frage beantwortet hat, die ich gestellt habe. Ressourcen, mein Freund. Ressourcen sind von unschätzbarem Wert. Und Sie mögen denken, dass dies sinnlos war und dass er den Mann nur hätte überprüfen sollen, aber das hat mir und Hunderten von anderen geholfen (sogar tausend). Also bitte bedenken Sie das.
Soundfx4
391

Wenn Sie Berechtigungen für alle Dateien a+rund alle Verzeichnisse festlegen a+xund dies rekursiv über den gesamten Unterverzeichnisbaum tun möchten , verwenden Sie:

chmod -R a+rX *

Das X(das ist Kapital X, nicht klein x!) Wird für Dateien ignoriert (es sei denn, sie sind bereits für jemanden ausführbar), wird jedoch für Verzeichnisse verwendet.

Pete
quelle
27
Gute Antwort. Beachten Sie nur, dass * nicht mit versteckten Dateien übereinstimmt (Namen, die mit einem Punkt beginnen). Es kann daher sinnvoller sein, zu verwenden. (für das aktuelle Verzeichnis).
Aaron Adams
21
Dies ist die richtige Antwort. Für meinen Fall wollte ich alle Verzeichnisse auf 775 und alle Dateien auf 664 setzen . @ Petes ausgezeichnete Antwort führte mich zu den chmodDokumenten, wo ich herausfand, dass ich sie verwenden könnte chmod -R g+wX .. Bravo!
Chadoh
8
Dies wird xbei Dateien nicht entfernt , wenn sie bereits vorhanden sind.
Benoit Duffez
5
Falls es nicht ganz klar ist, bedeutet Großbuchstabe X "Alle Verzeichnisse ausführbar machen" (aber keine Dateien).
Matt Browne
4
@BenoitDuffez Wenn Sie auch das ausführbare Bit aus Dateien entfernen möchten, können Sie Anweisungen wie "a-x + rX" kombinieren, um "x" von allem zu entfernen, und dann "r" auf alles und "x" nur auf Verzeichnisse setzen .
Nonnen
144

Sie können -Rmit chmodfür die rekursive Durchquerung aller Dateien und Unterordner verwenden.

Möglicherweise benötigen Sie sudo, da dies davon abhängt, ob LAMP vom aktuellen oder einem anderen Benutzer installiert wird:

sudo chmod -R 755 /opt/lampp/htdocs
Ravi Ranjan
quelle
17
Irgendwie hat sudo chmod 755 -R /directoryes nicht funktioniert, aber es hat sudo chmod -R 755 /directoryfunktioniert. Seltsam. Ich benutze übrigens Mac OS X.
Lomse
8
Dies ist meiner Erfahrung nach richtig. Das Flag muss direkt nach chmod erscheinen, nicht irgendwo in der Zeichenfolge.
Orionrush
1
Der obige schriftliche Befehl ist falsch. Der richtige rekursive Befehl lautet: sudo chmod -R 755 / opt / lampp / htdocs Hinweis: -R sollte vor 755
Sandip Patel - SM
Diese Lösung funktioniert gut für Redhat. Vielen Dank!
Lavande
Arbeitete gut auf RHEL und sudo chmod 755 -Rarbeitete
AnBisw
79

Der richtige rekursive Befehl lautet:

sudo chmod -R 755 /opt/lampp/htdocs

-R: Ändern Sie jeden Unterordner einschließlich des aktuellen Ordners

Pramendra Gupta
quelle
1
Hallo, bist du dir sicher, dass du trotz des Pfades einer bist?
Shareef
OSX USING: sudo chmod 777 logs / -R ERHALTEN: chmod: -R: Keine solche Datei oder kein solches Verzeichnis sollte sein: sudo chmod -R 777 logs /
elad silver
76

Verwenden Sie -R, um alle Unterordner (rekursiv) festzulegen

chmod 755 /folder -R

Verwenden Sie umask, um die Standardeinstellung für neue Ordner / Dateien cd / folder umask 755 festzulegen

Topera
quelle
24
Stellen Sie Ihre NICHT umaskauf 755 ein! Sie können keine von Ihnen erstellten Dateien oder Verzeichnisse auflisten, lesen oder verwenden!
Sleepynate
14
Meinten Sie umask 022?
Xkeeper
4
Dies setzt alles auf 755, einschließlich Dateien.!
Patrick Mutwiri
@sleepynate Was um alles in der Welt redest du? 755 bedeutet, dass der Eigentümer lesen, schreiben und ausführen kann und alle anderen Benutzer lesen und ausführen können, aber nicht in das Objekt schreiben können
svin83
2
@NicHartley @ svin83 umask sind die Bits, die von den Berechtigungen maskiert werden, also ist es effektiv die Umkehrung von chmod. λ ~ → umask 022 λ ~ → umask -S u=rwx,g=rx,o=rx λ ~ → umask 755 λ ~ → umask -S u=,g=w,o=w
Sleepynate
51

chmod 755 -R /opt/lampp/htdocswird die Berechtigungen rekursiv festlegen. Es gibt keine Möglichkeit, die Berechtigungen für Dateien automatisch nur in diesem Verzeichnis festzulegen, die nach dem Festlegen der Berechtigungen erstellt wurden. Sie können jedoch Ihre systemweiten Standarddateiberechtigungen durch Festlegen ändern umask 022.

Sleepynate
quelle
9
Die Antwort von sleepynate ist die EINZIGE richtige. Das Poster stellte zwei Fragen: 1) Wie kann ich Berechtigungen für Dateien und Ordner korrigieren und 2) wie ändere ich die Standardeinstellungen (dh "zukünftige" Dateien). Wie Nate sagte, ist der erste mit "chmod" und der zweite mit "umask". Ich würde auch hinzufügen, dass es KEINE MÖGLICHKEIT gibt, umask in nur 1 Verzeichnis zu ändern ... umask ist "alles oder nichts" pro Benutzer. Nichts hindert Sie jedoch daran, einen neuen Benutzer zu erstellen, der Gruppen mit Ihnen teilt, so dass Sie nur "sudo -u someuser [Datei erstellen]" können. Das denkt ein wenig über den Tellerrand hinaus, aber es ist eine gute
Problemumgehung
Ich denke, Sie haben Recht, können aber inheritin vielen Fällen keine Lösung sein, oder funktioniert es ausschließlich mit NTFS-3G?
Sebastian Schlicht
Ohne die Erlaubnis, Ordner zu erstellen, kann in Zukunft möglicherweise kein Ordner kopiert werden, z. B. myforldervon anderen Orten (z. B. einem PC) in dieses Zielverzeichnis (auf einem Server), da versucht wird, einen neuen Ordner zu erstellen das Zielverzeichnis mit dem Namen, zu myfolder dem Sie keine Berechtigung haben. Wie ich habe root, benutze ich einfach chown -R username:usergroup /directory.
Jason Goal
27

Vielleicht möchten Sie diese Antwort von nik auf superuser berücksichtigen und "one chmod" für alle Dateien / Ordner wie diese verwenden:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)
Ich bin Zesh
quelle
9
Achtung, es ist leicht, auf Befehlszeilenlimits zu stoßen.
Lothar
1
Ich habe diesen Fehler: -bash: / bin / chmod: Argumentliste zu lang
Oleg Abrazhaev
Es wäre besser, die -execOption von findzu verwenden, um den Argument list too longFehler zu überwinden .
Miravalls
Verwandte: Ändern Sie alle Ordnerberechtigungen mit einem Befehl bei U & L.
G-Man sagt 'Reinstate Monica'
20

Verwenden:

sudo chmod 755 -R /whatever/your/directory/is

Seien Sie jedoch vorsichtig damit. Es kann Ihnen wirklich weh tun, wenn Sie die Berechtigungen der falschen Dateien / Ordner ändern.

Nate Starner
quelle
20

Hier ist eine andere Möglichkeit, Verzeichnisse auf 775 und Dateien auf 664 zu setzen.

find /opt/lampp/htdocs \
\( -type f -exec chmod ug+rw,o+r {} \; \) , \
\( -type d -exec chmod ug+rwxs,o+rx {} \; \)

Es mag lang aussehen, ist aber aus drei Gründen ziemlich cool:

  1. Durchsucht das Dateisystem nur einmal und nicht zweimal.
  2. Bietet eine bessere Kontrolle darüber, wie Dateien behandelt werden, als wie Verzeichnisse behandelt werden. Dies ist nützlich, wenn Sie mit speziellen Modi wie dem Sticky-Bit arbeiten , die Sie wahrscheinlich auf Verzeichnisse, aber nicht auf Dateien anwenden möchten.
  3. Verwendet eine Technik direkt aus den manSeiten (siehe unten).

Beachten Sie, dass ich den Leistungsunterschied (falls vorhanden) zwischen dieser Lösung und der einfachen Verwendung von zwei Suchbefehlen (wie in der Lösung von Peter Mortensen) nicht bestätigt habe. Es ist jedoch ermutigend, ein ähnliches Beispiel im Handbuch zu sehen.

Beispiel von man findSeite:

find / \
\( -perm -4000 -fprintf /root/suid.txt %#m %u %p\n \) , \
\( -size +100M -fprintf /root/big.txt %-10s %p\n \)

Traverse the filesystem just once, listing setuid files and  direc‐
tories into /root/suid.txt and large files into /root/big.txt.

Prost

chrisfargen
quelle
Wie kann man das in ein Shell-Skript umwandeln, damit wir den Ordner openmod $ ausführen können?
StR
Leute, bitte benutzt xargs. Es spart Tausende von Prozessaufrufen.
Seanahern
13

chmod -R 755 directory_namefunktioniert, aber wie würden Sie neue Dateien auch auf 755 halten? Die Berechtigungen der Datei werden zur Standardberechtigung.

Sanchit Gupta
quelle
Ich habe es getan, kann aber von dort aus kein Terminal öffnen. Ich kann es nicht reparieren.
Kavindu Gayantha
9

Für Mac OS X 10.7 (Lion) gilt Folgendes:

chmod -R 755 /directory

Und ja, wie alle anderen sagen, seien Sie dabei vorsichtig.

wmartin
quelle
9

Sie möchten sicherstellen, dass die entsprechenden Dateien und Verzeichnisse geändert wurden / die entsprechenden Berechtigungen vorhanden sind. Für alle gewünschten Verzeichnisse

find /opt/lampp/htdocs -type d -exec chmod 711 {} \;

Und für alle Bilder, JavaScript, CSS, HTML ... sollten Sie sie nicht ausführen. Also benutze

chmod 644 img/* js/* html/*

Für den gesamten Logikcode (z. B. PHP-Code) sollten Sie die Berechtigungen so festlegen, dass der Benutzer diesen Code nicht sehen kann:

chmod 600 file
NikolaiDante
quelle
6

Ich glaube, Adam hat gefragt, wie der umask-Wert für alle Prozesse geändert werden soll, die für die Ausführung im /opt/lampp/htdocsVerzeichnis verwendet werden.

Die Maske für den Benutzerdateierstellungsmodus (umask) wird verwendet, um die Dateiberechtigung für neu erstellte Dateien zu ermitteln. Es kann verwendet werden, um die Standarddateiberechtigung für neue Dateien zu steuern.

Wenn Sie also eine Art FTP-Programm zum Hochladen von Dateien verwenden /opt/lampp/htdocs, müssen Sie Ihren FTP-Server so konfigurieren, dass er die gewünschte Umask verwendet.

Wenn Dateien / Verzeichnisse beispielsweise von PHP erstellt werden, müssen Sie den PHP-Code ändern

<?php
umask(0022);
// other code
?>

Wenn Sie neue Dateien / Ordner aus Ihrer Bash-Sitzung erstellen, können Sie den umask-Wert in Ihrem Shell-Profil ~ / .bashrc festlegen. Oder Sie können umask in /etc/bashrcoder /etc/profilefile für alle Benutzer einrichten . Fügen Sie der Datei Folgendes hinzu: umask 022

Sample umask Values and File Creation Permissions
If umask value set to   User permission     Group permission     Others permission
000                         all              all                   all
007                         all              all                   none
027                         all          read / execute            none

Und um die Berechtigungen für bereits erstellte Dateien zu ändern, können Sie find verwenden. Hoffe das hilft.

Viktor
quelle
4

Es gibt zwei Antworten, um Dateien zu finden und chmodauf sie anzuwenden . Das erste ist finddie Datei und chmodwird so angewendet , wie sie gefunden wird (wie von @WombleGoneBad vorgeschlagen).

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

Die zweite Lösung besteht darin, eine Liste aller Dateien mit dem findBefehl zu generieren und diese Liste dem chmodBefehl zu übergeben (wie von @lamgesh vorgeschlagen).

chmod 755 $(find /path/to/base/dir -type d)

Beide Versionen funktionieren gut, solange die Anzahl der vom findBefehl zurückgegebenen Dateien gering ist. Die zweite Lösung sieht gut aus und ist besser lesbar als die erste. Wenn eine große Anzahl von Dateien vorhanden ist, gibt die zweite Lösung den folgenden Fehler zurück:Argument list too long.

Mein Vorschlag ist also

  1. Verwenden chmod -R 755 /opt/lampp/htdocsSie diese Option, wenn Sie die Berechtigungen aller Dateien und Verzeichnisse gleichzeitig ändern möchten.
  2. Verwenden find /opt/lampp/htdocs -type d -exec chmod 755 {} \;Sie diese Option, wenn die Anzahl der von Ihnen verwendeten Dateien sehr groß ist. Die -type xOption sucht nur nach einem bestimmten Dateityp, wobei d zum Suchen des Verzeichnisses, f für die Datei und l zum Verknüpfen verwendet wird.
  3. verwenden Sie chmod 755 $(find /path/to/base/dir -type d)andernfalls
  4. Verwenden Sie den ersten in jeder Situation
Prabhu
quelle
2

Es ist sehr einfach.

Gehen Sie im Terminal zum Dateimanager. Beispiel : sudo nemo. /opt/Klicken Sie dann auf Eigenschaften → Berechtigung . und dann Andere . Zum Schluss ändern Sie, um Zugriff zu erstellen und zu löschen und zu archivieren, um zu lesen und zu schreiben, und klicken Sie auf die Schaltfläche Anwenden ... und arbeiten.

Debian.
quelle
Was ist Sudo Nemo?
Vikranth