Chmod đệ quy: rw cho tệp, rwx cho thư mục


28

Tôi muốn chmodrất nhiều tập tin và thư mục. Như xchỉ ra danh sách cho các thư mục và thực thi cho các tệp thông thường tôi muốn áp dụng rwcho các tệp và rwxcho các thư mục. Có thể chỉ sử dụng chmodlệnh?

Nếu không, cách thuận tiện nhất là gì?

Làm chmod -R 770không phải là một khả năng vì tôi không muốn các tệp thông thường có thể thực thi được.


1
Bạn có thực sự muốn sự cho phép ghi công khai trên các tập tin và thư mục? Điều đó có nghĩa là bạn không quan tâm ai ghi lại bất kỳ tập tin nào?
Jonathan Leffler

Thật. Tôi đã thay đổi nó ở trên.
Đã xóa

Câu trả lời:


19

Tôi làm điều này nhân dịp bằng một findlệnh duy nhất . Xấu xí nhưng hiệu quả.

find /p/a/t/h \( -type d -exec chmod 755 {} \; \) -o \( -type f -exec chmod 644 {} \; \)

Không "{}" cần được trích dẫn, chỉ trong trường hợp đường dẫn giữ khoảng trắng? Thích find . -type d -exec chmod -vc 755 "{}" \;(bao gồm cả -vcmột số phản hồi). (Và có lẽ, chỉ để làm rõ, thêm hai lệnh độc lập vào câu trả lời?)
Arjan

Không, {} không cần trích dẫn (Tôi chỉ kiểm tra là hoàn toàn chắc chắn). Khi tìm thấy chèn {} vào lệnh, nó đã thoát đúng. Tôi đã không tra cứu các hoạt động bên trong của tìm kiếm, nhưng tôi sẽ giả sử rằng nó tạo ra một mảng đối số để truyền cho exec () và nó sẽ strcpy () tên tệp vào mảng. Khi chmod nhìn vào các đối số của nó, nó sẽ xuất hiện đúng.
baum hành

37

Sử dụng quyền X, từ trang man:

Các bit thực hiện / tìm kiếm nếu tệp là một thư mục hoặc bất kỳ bit thực hiện / tìm kiếm nào được đặt ở chế độ ban đầu (không sửa đổi). Các thao tác với ký hiệu perm "X" chỉ có ý nghĩa kết hợp với ký hiệu op "+" và bị bỏ qua trong tất cả các trường hợp khác.

Vì vậy, làm như sau:

chmod -R a-x [directory]
chmod -R a+rwX [directory]

Điều này loại bỏ bit thực thi khỏi tất cả các tệp và thư mục theo sau bằng cách thêm các đặc quyền đọc và ghi vào mọi thứ và thực thi các đặc quyền chỉ các thư mục. (Không có tệp thông thường nào có bit thực thi nữa từ bước đầu tiên.)


1
Điều này sẽ không ép buộc chế độ 666 trên các tệp thông thường. nó không xóa bit thực thi cho các tệp thông thường nếu chúng đã được đặt.
quack quixote

Vì vậy, trong trường hợp đó bạn có thể làm chmod -R a-x [directory]theo chmod -R a+rwX [directory]?
jwaddell

@jwaddel: Điều đó nên làm việc. Bạn đang xóa tất cả các bit thực thi, bất kể loại tệp / thư mục, sau đó thêm thực thi vào chỉ thư mục và các tệp thông thường đã có bit thực thi (hiện không có.)
Ben S

Một khi tôi làm a-x, thư mục không thể truy cập. Trong thực tế, chmod không thành công với quyền bị từ chối và sẽ không xóa bit thực thi khỏi các tệp trong thư mục. Có cách nào để làm điều này mà không cần root?
avakar

14

Bạn cũng có thể sử dụng findcùng với xargs:

find . -type f -print0 | xargs -0 chmod 666
find . -type d -print0 | xargs -0 chmod 777

trong đó -typechỉ định d irectory hoặc f ile.


1
Không xargs có giới hạn chiều dài? Đó là rất nhiều tập tin và thư mục.
Đã xóa

2
Tôi sẽ làm thư mục đầu tiên, sau đó tập tin. Nếu không, bạn sẽ có nguy cơ bỏ lỡ một số cây con do thiếu sự cho phép. Ngoài ra, bạn nên kiểm tra xem danh sách đã được trinh sát trước hay sau chmod, nếu không, giống như trên. Và vâng, tôi sẽ không sử dụng xargs.
Stefano Borini

1
xargsđủ thông minh để phá vỡ các dòng lệnh dài thành nhiều lần thực thi. Tham khảo trang web xargs của bạn và chắc chắn kiểm tra xargs --show-limits.
Mike
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.