đệ quy thay đổi tập tin nhưng không thư mục?


13

Tôi đã thực hiện thay đổi đệ quy hàng loạt quyền của một số tệp mà tôi đã di chuyển sang hệ thống unix. Tôi đã thay đổi chúng thành ug + rw, nhưng sau đó tôi thấy rằng tôi không thể vượt qua các thư mục con. Tôi đã xem trang hướng dẫn chmodvà không thấy bất kỳ lời giải thích nào về việc loại trừ các thư mục, vì vậy tôi đã tìm hiểu một chút và thấy rằng mọi người thường findthay đổi đệ quy các quyền trên các thư mục thành 'thực thi' cho người dùng và nhóm. Tôi đã làm điều đó và sau đó tôi có thể nhìn vào chúng.

Nhưng dường như tôi có thể có thể thực hiện việc tìm kiếm này chmod- để thay đổi đệ quy các tệp để đọc / ghi nhưng không làm cho các thư mục không thể sửa chữa được. Tôi đã làm điều này theo cách 'đúng' hay có cách nào đơn giản hơn để làm điều đó?

Câu trả lời:


12

Giải pháp tốt hơn nên là

chmod -R ug=rwX,o=rX /path

Trong đó vốn Xcó nghĩa là: đặt bit thực thi nếu

tập tin là một thư mục hoặc đã có sự cho phép thực thi đối với một số người dùng

(trích dẫn từ chmodtrang người đàn ông).

Hoặc, nếu bạn muốn sử dụng find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)

Tôi đã sử dụng phiên bản mở rộng cho mọi người của lệnh này cho ổ cứng USB của mình: chmod -v -R ugo = rwX / path Cảm ơn!
Các Dude

Rõ ràng là không có cách nào mà không sử dụng findđể đặt tất cả các quyền của tệp thành 600 và tất cả các quyền của thư mục thành 700. (Tôi đã đến đây thông qua các thông tin của mình về chủ đề này.) Nếu điều đó có thể được thực hiện bằng một chmod -Rlệnh duy nhất , vui lòng sửa cho tôi.
tự đại diện

@Wildcard: không chính xác, lệnh chmod -R u=rwX,go= /paththực hiện gần như những gì bạn muốn: nó đặt tất cả các thư mục thành 700 và tất cả các tệp thành 600 hoặc 700, tùy thuộc vào việc bit thực thi đã được đặt hay chưa và tôi nghĩ đây là điều đúng đắn .
enzotib

1
@enzotib, vâng, hầu như, nhưng không hoàn toàn. Trong trường hợp của tôi, tôi muốn vô hiệu hóa bit thực thi cho tất cả các tệp (tất nhiên không phải là thư mục) bất kể chúng là tập lệnh hay nhị phân hay bất cứ thứ gì. Vì vậy, findlệnh bạn đã viết là rất hữu ích như là một mẫu. :)
tự đại diện

@Wildcard điều gì về việc loại bỏ bit thực thi trước, đệ quy, sau đó chỉ thêm lại vào các thư mục bằng lệnh trên?
Michael

3

Sử dụng find là cách 'đúng' và là cách lập trình duy nhất, mặc dù có các biến thể:

find . -type f -exec chmod ug+rw {} +  # "+" may not be on all systems

hoặc là

find . -type f -print0 | xargs -r0 chmod ug+rw  # similar to the -exec + functionality

hoặc chậm nhất:

find . -type f -exec chmod ug+rw {} \;  # in case xargs is not installed

Mỗi trong số này chọn một tệp (không phải thư mục, không phải symlink) và áp dụng chmodlệnh trên đó. Hai lần đầu tiên giảm số lượng cuộc gọi chmodbằng cách nối thêm tệp vào cuối dòng lệnh nội bộ mỗi lần cho đến khi đạt mức tối đa (thường là 10), sau đó gọi lệnh và bắt đầu xây dựng lại một lệnh mới. Câu lệnh cuối cùng tạo ra một quy trình mới cho mỗi tệp, vì vậy nó kém hiệu quả hơn.

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.