Làm cách nào để thay đổi quyền cho một thư mục và tất cả các thư mục con và tệp của nó trong một bước trong Linux? [đóng cửa]


1806

Tôi muốn thay đổi quyền của một thư mục và tất cả các thư mục và tệp phụ của nó trong một bước (lệnh) trong Linux.

Tôi đã thử lệnh dưới đây nhưng nó chỉ hoạt động cho thư mục được đề cập:

chmod 775 /opt/lampp/htdocs

Có cách nào để thiết lập chmod 755cho /opt/lampp/htdocsvà tất cả các nội dung của nó bao gồm các thư mục con và các tập tin?

Ngoài ra, trong tương lai, nếu tôi tạo một thư mục hoặc tệp mới bên trong htdocs, làm thế nào các quyền của điều đó có thể tự động được đặt thành 755?

Tôi cũng đã xem qua liên kết này:

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


4
Bạn đã có ý định viết chmod 75 /opt/lampp/htdocshay nên thực sự như chmod 755 /opt/lampp/htdocsvậy?
HelloGoodbye

233
Việc câu hỏi được bình chọn cao thứ 4 về Linux là "đóng như lạc đề" rất vui nhộn. Ai nhưng một lập trình viên sẽ quan tâm đến chmod? Làm thế nào là lạc đề này? Tại sao các thẻ "quyền", "thư mục" và "cmod" thậm chí không có chủ đề?
Arthur Dent

8
@ArthurDent, vì câu hỏi này (trong khi hoàn toàn hợp lệ và hữu ích) phù hợp hơn với trang SE tập trung vào hệ thống, như SuperUser hoặc ServerFault. Nó không liên quan rõ ràng đến lập trình.
timelmer

26
@timelmer Chắc chắn, nhưng tôi hỏi lại, tại sao các thẻ "quyền", "thư mục" và "cmod"? Khi nào cmod sẽ được sử dụng 'rõ ràng' để lập trình?
Arthur Dent

9
Nếu bạn muốn thực sự kén chọn, Bash thực sự là một ngôn ngữ kịch bản, nhưng php cũng vậy, điều mà SO dường như không bận tâm.
timelmer

Câu trả lời:


2957

Các câu trả lời khác là chính xác, trong đó chmod -R 755sẽ đặt các quyền này cho tất cả các tệp và thư mục con trong cây. Nhưng tại sao bạn muốn ? Nó có thể có ý nghĩa đối với các thư mục, nhưng tại sao lại thiết lập bit thực thi trên tất cả các tệp?

Tôi nghi ngờ những gì bạn thực sự muốn làm là đặt các thư mục thành 755 và để các tệp một mình hoặc đặt chúng thành 644. Đối với điều này, bạn có thể sử dụng findlệnh. Ví dụ:

Để thay đổi tất cả các thư mục thành 755 ( drwxr-xr-x):

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

Để thay đổi tất cả các tệp thành 644 ( -rw-r--r--):

find /opt/lampp/htdocs -type f -exec chmod 644 {} \;

231
Bất cứ ai quan tâm để giải thích những gì {} \;ở cuối dòng có nghĩa là gì?
Nilzor

307
@Nilzor chmod 644 {} \;chỉ định lệnh sẽ được thực thi bởi findmỗi tệp. {}được thay thế bằng đường dẫn tệp và dấu chấm phẩy biểu thị phần cuối của lệnh (đã thoát, nếu không nó sẽ được giải thích bằng shell thay vì find).
tobbez

25
"nhưng tại sao lại thiết lập bit thực thi trên tất cả các tệp" Tại sao không? Tôi mới sử dụng Ubuntu / Linux ...
FlavorScape

12
@FlavorScape Womble đang thiết lập bit thực thi riêng trên các thư mục được trả về bởi find. Quyền thực thi trên một thư mục cho phép một lớp người dùng liệt kê nội dung của thư mục đó và ghi vào đó. Nói chung, bạn muốn cả r và x trên một thư mục để nó có thể truy cập được cho bạn, mặc dù có thể có các trường hợp cạnh lạ khi bạn chỉ đặt cái này hoặc cái kia. Xem hướng dẫn này để biết thêm thông tin: nixsrv.com/llthw/ex23
Alexandr Kurilin

25
Ngoại trừ trạng thái ngủ, mọi phản hồi đều bị bỏ qua để giải quyết khía cạnh câu hỏi của anh ta liên quan đến việc thiết lập quyền cho các tệp / thư mục được tạo trong tương lai .
JGarrido

781

Kiểm tra tùy chọn -R

chmod -R <permissionsettings> <dirname>

Trong tương lai, bạn có thể tiết kiệm rất nhiều thời gian bằng cách kiểm tra trang man trước:

man <command name>

Vì vậy, trong trường hợp này:

man chmod

147
cái gì manvậy
Adam

36
nó là viết tắt của trang thủ công và là một lệnh linux hiển thị trang man cho một lệnh (hầu hết các lệnh linux đều có trang man). thử người đàn ông ls hoặc người đàn ông.
Steve Robillard

8
Điều này không hoạt động với tôi trong Terminal trong Mac OS X. Ở đó tôi đã thực hiện "chmod -R <allowinstall> <dirname> *" và nó đã hoạt động.
Einar Ólafsson

127
Tôi nghĩ bây giờ, thực sự nhanh hơn để đăng ở đây hoặc sử dụng Google hơn là sử dụng man. Đặc biệt đối với một cái gì đó như grepnếu bạn chưa quen với mannó, có thể rất tốn thời gian để xác định các ví dụ trong tài liệu, nhưng Google hoặc SO cung cấp các ví dụ trong vài giây.
ely

17
Đối với hồ sơ, những người không quen thuộc với Linux có thể không quen thuộc với con người. Tôi chỉ biết về sự tồn tại của nó, nhưng cố gắng tìm ra cách sử dụng nó sẽ đòi hỏi một cuộc phiêu lưu của google. Có thể là một liên doanh đáng giá, nhưng bạn nên nhận ra rằng tôi đã tìm thấy bài viết RẤT NÀY qua google và nó đã trả lời câu hỏi CHÍNH XÁC mà tôi đang hỏi. Tài nguyên, bạn của tôi. Tài nguyên là vô giá. Và bạn có thể nghĩ rằng điều này là vô nghĩa và anh ta nên kiểm tra người đàn ông đó, nhưng điều này đã giúp tôi và hàng trăm người khác (hàng ngàn thậm chí). Vì vậy, hãy xem xét điều đó.
Soundfx4

391

Nếu bạn muốn đặt quyền trên tất cả các tệp thành a+rvà tất cả các thư mục thành a+xvà thực hiện điều đó theo cách đệ quy thông qua cây thư mục con hoàn chỉnh, hãy sử dụng:

chmod -R a+rX *

Các X(có nghĩa là vốn X, không nhỏ x!) Bị bỏ qua cho các tập tin (trừ khi họ là thực thi cho một người nào đó đã được) nhưng được sử dụng cho thư mục.


27
Câu trả lời chính xác. Chỉ cần lưu ý rằng * sẽ không khớp với các tệp ẩn (tên bắt đầu bằng dấu chấm). Nó có thể có ý nghĩa hơn, sau đó, để sử dụng. (đối với thư mục hiện tại).
Aaron Adams

21
Đây là câu trả lời chính xác. Đối với trường hợp của tôi, tôi muốn đặt tất cả các thư mục thành 775 và tất cả các tệp thành 664 . Câu trả lời tuyệt vời của @ Pete dẫn tôi đến các chmodtài liệu, nơi tôi nhận ra mình có thể sử dụng chmod -R g+wX .. Bravo!
chadoh

8
Điều này sẽ không xóa xtrên các tập tin nếu họ đã có nó.
Benoit Duffez

5
Trong trường hợp không hoàn toàn rõ ràng, chữ hoa X có nghĩa là "làm cho tất cả các thư mục có thể thực thi được" (nhưng không phải là tệp).
Matt Browne

4
@BenoitDuffez nếu mục tiêu của bạn là loại bỏ bit thực thi khỏi các tệp, bạn có thể kết hợp các lệnh, như "a-x + rX" để xóa "x" khỏi mọi thứ và sau đó đặt "r" thành mọi thứ và chỉ "x" vào thư mục .
nunk

144

Bạn có thể sử dụng -Rvới chuyển chmodđổi đệ quy của tất cả các tệp và thư mục con.

Bạn có thể cần sudo vì nó phụ thuộc vào LAMP được cài đặt bởi người dùng hiện tại hoặc người khác:

sudo chmod -R 755 /opt/lampp/htdocs

17
Bằng cách nào đó, sudo chmod 755 -R /directorykhông làm việc nhưng sudo chmod -R 755 /directoryđã làm. Kỳ dị. Nhân tiện, tôi đang sử dụng Mac os x.
lomse

8
Điều này là chính xác trong kinh nghiệm của tôi. Cờ phải xuất hiện trực tiếp sau chmod, không phải bất cứ nơi nào trong chuỗi.
orionrush

1
Trên lệnh viết là sai. Lệnh đệ quy đúng là: sudo chmod -R 755 / opt / lampp / htdocs Lưu ý: -R phải trước 755
Sandip Patel - SM

Giải pháp này đang hoạt động tốt cho Redhat. Cảm ơn!
Lavande

Đã hoạt động tốt trên RHEL và sudo chmod 755 -Rhoạt động
AnBisw 4/12/18

79

Lệnh đệ quy đúng là:

sudo chmod -R 755 /opt/lampp/htdocs

-R: thay đổi mọi thư mục con bao gồm cả thư mục hiện tại


1
chào bạn có chắc chắn về thư mục hiện tại bạn là một mặc dù đường dẫn?
chia sẻ

OSX SỬ DỤNG: sudo chmod 777 log / -R GETTING: chmod: -R: Không có tập tin hoặc thư mục nào NÊN ĐƯỢC: sudo chmod -R 777 log /
elad silver

76

Để đặt thành tất cả các thư mục con (đệ quy), hãy sử dụng -R

chmod 755 /folder -R

Và sử dụng umask để đặt mặc định cho các thư mục / tệp mới cd / thư mục umask 755


24
KHÔNG đặt umasksố 755 của bạn ! Bạn sẽ không thể liệt kê, đọc hoặc sử dụng bất kỳ tệp hoặc thư mục nào bạn tạo!
ngủ

14
Ý bạn là umask 022?
Xkeeper

4
cái này đặt tất cả thành 755, bao gồm các tệp.!
Patrick Mutwiri

@s ngủynate Bạn đang nói về cái quái gì vậy? 755 có nghĩa là chủ sở hữu có thể đọc, viết và thực thi và tất cả người dùng khác có thể đọc và thực thi, nhưng không ghi vào đối tượng
svin83

2
@NicHartley @ svin83 umask là các bit sẽ bị che đi khỏi các quyền, vì vậy nó thực sự là nghịch đảo của chmod. λ ~ → umask 022 λ ~ → umask -S u=rwx,g=rx,o=rx λ ~ → umask 755 λ ~ → umask -S u=,g=w,o=w
ngủ

51

chmod 755 -R /opt/lampp/htdocssẽ đệ quy thiết lập các quyền. Không có cách nào để tự động đặt quyền cho các tệp trong thư mục này được tạo sau khi bạn đặt quyền, nhưng bạn có thể thay đổi quyền truy cập tệp mặc định trên toàn hệ thống bằng cách cài đặt umask 022.


9
Câu trả lời của Sleepynate là CHỈ đúng. Người đăng đã hỏi hai câu hỏi: 1) Làm cách nào để sửa quyền trên tệp và thư mục và 2) làm cách nào để thay đổi mặc định (có nghĩa là tệp "tương lai"). Như nate đã nói, thứ nhất là với "chmod", và thứ hai là với "umask". Tôi cũng nói thêm rằng KHÔNG CÓ CÁCH để thay đổi ô trên chỉ 1 thư mục ... ô là "tất cả hoặc không có gì" cho mỗi người dùng. Tuy nhiên, không có gì ngăn bạn tạo một người dùng mới, người chia sẻ các nhóm với bạn, để bạn chỉ cần 'sudo -u someuser [tạo tập tin] ". Đó là suy nghĩ bên ngoài hộp một chút, nhưng đó là một cách giải quyết tốt.
Scott Prive

Tôi nghĩ bạn đã đúng, nhưng không inheritthể là một giải pháp cho nhiều trường hợp hoặc nó sẽ chỉ hoạt động với NTFS-3G?
Sebastian Schlicht

không có quyền cho các thư mục có thể được tạo trong tương lai, người ta không thể sao chép thư mục myforldertừ các nơi khác (như PC) sang thư mục đích này (trên máy chủ) vì nó sẽ cố gắng tạo thư mục mới trong thư mục đích với tên myfolder mà bạn không có quyền làm như vậy. Như tôi có root, tôi chỉ sử dụng chown -R username:usergroup /directory.
Jason Goal

27

Bạn có thể muốn xem xét câu trả lời này được cung cấp bởi nik trên superuser và sử dụng "one chmod" cho tất cả các tệp / thư mục như thế này:

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

9
Cảnh báo, thật dễ dàng để chạy vào giới hạn dòng lệnh.
Lothar

1
Tôi có lỗi này: -bash: / bin / chmod: Danh sách đối số quá dài
Oleg Abrazhaev 16/07/2015

Sẽ tốt hơn nếu sử dụng -exectùy chọn findđể khắc phục Argument list too longlỗi.
ảo ảnh


20

Sử dụng:

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

Tuy nhiên, hãy cẩn thận với điều đó. Nó thực sự có thể làm tổn thương bạn nếu bạn thay đổi quyền của các tệp / thư mục sai.


20

Đây là một cách khác để đặt thư mục thành 775 và tệp thành 664.

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

Nó có thể trông dài, nhưng nó khá tuyệt vì ba lý do:

  1. Quét qua hệ thống tệp chỉ một lần thay vì hai lần.
  2. Cung cấp kiểm soát tốt hơn cách file vs được xử lý như thế nào các thư mục được xử lý. Điều này rất hữu ích khi làm việc với các chế độ đặc biệt như bit dính , mà bạn có thể muốn áp dụng cho các thư mục nhưng không phải các tệp.
  3. Sử dụng một kỹ thuật ra khỏi các mantrang (xem bên dưới).

Lưu ý rằng tôi chưa xác nhận sự khác biệt về hiệu năng (nếu có) giữa giải pháp này và chỉ đơn giản là sử dụng hai lệnh find (như trong giải pháp của Peter Mortensen). Tuy nhiên, nhìn thấy một ví dụ tương tự trong hướng dẫn là đáng khích lệ.

Ví dụ từ man findtrang:

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.

Chúc mừng


Bây giờ, làm thế nào để biến nó trong tập lệnh shell để chúng ta có thể chạy thư mục openmod $?
StR

Mọi người, xin vui lòng sử dụng xargs. Nó tiết kiệm hàng ngàn lời mời quá trình.
seanaéc

13

chmod -R 755 directory_namehoạt động, nhưng làm thế nào bạn sẽ giữ các tập tin mới đến 755? Quyền của tập tin trở thành quyền mặc định.


Tôi đã làm nó nhưng không thể mở thiết bị đầu cuối từ đó. Tôi không thể sửa nó.
Kavindu Gayantha

9

Đối với Mac OS X 10.7 (Lion), đó là:

chmod -R 755 /directory

Và vâng, như tất cả những người khác nói, hãy cẩn thận khi làm điều này.


9

Bạn muốn đảm bảo rằng các tệp và thư mục phù hợp là chmod-ed / quyền cho những tệp phù hợp. Đối với tất cả các thư mục bạn muốn

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

Và đối với tất cả các hình ảnh, JavaScript, CSS, HTML ... tốt, bạn không nên thực hiện chúng. Vì vậy, sử dụng

chmod 644 img/* js/* html/*

Nhưng đối với tất cả các mã logic (ví dụ mã PHP), bạn nên đặt các quyền sao cho người dùng không thể thấy mã đó:

chmod 600 file

6

Tôi nghĩ rằng Adam đã hỏi làm thế nào để thay đổi giá trị umask cho tất cả các quy trình buộc phải hoạt động trên /opt/lampp/htdocsthư mục.

Mặt nạ chế độ tạo tệp người dùng (umask) được sử dụng để xác định quyền truy cập tệp cho các tệp mới được tạo. Nó có thể được sử dụng để kiểm soát quyền tập tin mặc định cho các tập tin mới.

Vì vậy, nếu bạn sẽ sử dụng một số loại chương trình ftp để tải tệp lên, /opt/lampp/htdocsbạn cần định cấu hình máy chủ ftp của mình để sử dụng umask bạn muốn.

Nếu tệp / thư mục được tạo ví dụ bằng php, bạn cần sửa đổi mã php

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

nếu bạn sẽ tạo các tệp / thư mục mới từ phiên bash của mình, bạn có thể đặt giá trị umask trong hồ sơ shell của mình ~ / .bashrc Hoặc bạn có thể thiết lập umask trong /etc/bashrchoặc /etc/profiletệp cho tất cả người dùng. thêm phần sau vào tập tin: 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

Và để thay đổi quyền cho các tệp đã được tạo, bạn có thể sử dụng find. Hi vọng điêu nay co ich.


4

Có hai câu trả lời về việc tìm tập tin và áp dụng chmodchúng. Đầu tiên là findtệp và áp dụng chmodkhi tìm thấy (như được đề xuất bởi @WombleGoneBad).

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

Giải pháp thứ hai là tạo danh sách tất cả các tệp có findlệnh và cung cấp danh sách này cho chmodlệnh (theo đề xuất của @lamgesh).

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

Cả hai phiên bản này đều hoạt động tốt miễn là số lượng tệp được findlệnh trả về là nhỏ. Giải pháp thứ hai trông tuyệt vời và dễ đọc hơn giải pháp thứ nhất. Nếu có số lượng tệp lớn, giải pháp thứ hai trả về lỗi:Argument list too long.

Vì vậy, đề nghị của tôi là

  1. Sử dụng chmod -R 755 /opt/lampp/htdocsnếu bạn muốn thay đổi quyền của tất cả các tệp và thư mục cùng một lúc.
  2. Sử dụng find /opt/lampp/htdocs -type d -exec chmod 755 {} \;nếu số lượng tệp bạn đang sử dụng là rất lớn. Các -type xtùy chọn tìm kiếm cho loại hình cụ thể của chỉ tập tin, trong đó d được sử dụng cho việc tìm kiếm danh bạ, e cho tập tin và l cho liên kết.
  3. Sử dụng chmod 755 $(find /path/to/base/dir -type d)khác
  4. Tốt hơn là sử dụng cái đầu tiên trong mọi tình huống

2

Nó rất đơn giản.

Trong Terminal đi đến trình quản lý tập tin. ví dụ : sudo nemo. Đi /opt/rồi bấm Thuộc tính → Quyền . và sau đó khác . Cuối cùng, thay đổi để tạo và xóa và tập tin acess để đọc và viết và nhấp vào nút áp dụng ... Và làm việc.


sudo nemo là gì?
Vikranth Inti
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.