Sử dụng lệnh chmod một cách chọn lọc


11

Tôi muốn đặt quyền 755 cho tất cả các tệp và thư mục con trong một thư mục cụ thể, nhưng tôi chỉ muốn thực thi chmod 755 cho những thành phần không có quyền 755.

find /main_directory/ -exec chmod 755 {} \;

Nếu findlệnh trả về một danh sách dài, việc này sẽ mất rất nhiều thời gian. Tôi biết rằng tôi có thể sử dụng lệnh stat để kiểm tra quyền cấp độ tệp Octal của từng thành phần và sau đó sử dụng if-other để chuyển quyền cho tệp, nhưng có cách tiếp cận dòng nào sử dụng không findxargstrước tiên hãy kiểm tra quyền của tệp / thư mục nào và sau đó sử dụng chmodđể thay đổi nó thành 755 nếu nó được đặt thành thứ khác.


6
Đây có thể là tối ưu hóa sớm, và nó thậm chí có thể không thực hiện nếu nhanh hơn. Làm tất cả những kiểm tra có thể làm chậm nó. Kiểm tra để đảm bảo rằng nó nhanh hơn, sẽ chỉ trả hết, nếu bạn phải làm điều này rất nhiều.
ctrl-alt-delor

3
Bạn có thể không muốn cấp quyền thực thi cho tất cả các tệp. Điều này sẽ tạo ra một rủi ro bảo mật. (đây là một trong những vectơ virus trên Windows của Microsoft: mọi thứ đều có thể thực thi được). Trong chế độ biểu tượng bạn có thể nói u+rw,go+r,go-w,ugo+X- lưu ý vốn.
ctrl-alt-delor

Tôi đồng ý với @ ctrl-alt-delor nhưng sẽ đề xuất một cái gì đó gần hơn với những gì bạn đã hỏi, u = rwX, go = rX sẽ đạt được điều tương tự.
chim cánh cụt359

Câu trả lời:


21

Nếu bạn muốn thay đổi quyền thành 755cả hai tệp và thư mục, thì không có lợi ích thực sự nào khi sử dụng find(ít nhất là từ quan điểm hiệu suất) và bạn chỉ có thể làm

chmod -R 755 /main_directory

Nếu bạn thực sự muốn sử dụng findđể tránh thay đổi quyền đối với những thứ đã có 755quyền (để tránh cập nhật dấu thời gian ctime của họ), thì bạn cũng nên kiểm tra các quyền hiện tại trên mỗi thư mục và tệp:

find /main_directory ! -perm 0755 -exec chmod 755 {} +

Ý -exec ... {} +chí sẽ thu thập càng nhiều tên đường càng tốt để vượt qua ! -perm 0755bài kiểm tra và thực hiện chmodtrên tất cả chúng cùng một lúc.

Thông thường, người ta sẽ muốn thay đổi quyền trên các tệp và thư mục riêng biệt, để không phải tất cả các tệp đều có thể thực thi được:

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +

Làm việc như quyến rũ, cảm ơn bạn. Trân trọng, Kumarjit
Kumarjit Ghosh

1
Tôi nghi ngờ sử dụng +thay vì ;làm cho một sự khác biệt lớn ở đây.
Kevin

Đây là cách nhanh chóng - tránh kiểm tra. Tôi sẽ tiếp tục sử dụng find để tạo một danh sách chỉ các tệp bạn có quyền thay đổi, điều này sẽ tránh lỗi chmod trên các tệp mà nó không thể thay đổi. <pre> <code> # rwx, rw, wx, w chỉ tìm thấy. -user $ (whoami) -perm / 002! -perm 0755 -exec chmod 0755 {} \; # chia thành hai thao tác tìm. -user $ (whoami) -perm / 002! -perm 0755> /tmp/chfiles.txt cho tệp bằng $ (</ tmp / chfiles.txt) làm chmod --quiet 0755 "$ {file}" được thực hiện </ code> </ pre>
Chris Reid

@ChrisReid Lưu ý rằng việc lặp qua danh sách các tên đường dẫn như thế sẽ bị phá vỡ nếu bất kỳ tên đường dẫn nào chứa ký tự khoảng trắng.
Kusalananda

Tôi đoán bạn cần thay đổi Dấu tách trường nội bộ (IFS) thành '\ n' trong tập lệnh. Đây là các cài đặt môi trường, cách shell diễn giải chúng phụ thuộc vào giá trị của các cài đặt đó. Tôi kiểm tra các tập lệnh trên các tập tin giả trước khi sử dụng chúng để loại bỏ các lỗi gây nhiễu như đổi tên tập tin hoặc ghi đè lên chúng. Tôi thích cách in printf của IFS. IFS = $ (printf "\ n") # rất dễ đọc
Chris Reid

1

Như findđã nhận được -exec ... +cú pháp, không có nhiều điểm trong việc sử dụng xargs, nhưng khi bạn yêu cầu nó:

find /main_directory -not -perm 0755 | xargs chmod 755

1
Cũng lưu ý rằng xargs không có -0(kết hợp với -print0tìm kiếm, là phần mở rộng GNU) có thể khá khó bảo mật nếu kẻ tấn công tiềm năng có thể tạo tên tệp bao gồm khoảng trắng hoặc các ký tự đặc biệt khác trong đó. Vì vậy, tốt hơn hãy bám vào -execkhi bạn có thể
Matija Nalis

Không cần xargs(chỉ sử dụng -exec), và nếu bạn sử dụng nó, bạn nên sử dụng -print0/ -0như Matija nói.
Kevin
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.