Đây là một tập lệnh mà bạn có thể gọi bằng cách chuyển chế độ làm đối số đầu tiên và một hoặc nhiều tên thư mục làm đối số tiếp theo. Trong Linux, nếu bạn không vượt qua bất kỳ tên thư mục nào, nó sẽ như thể bạn đã vượt qua .
(thư mục hiện tại). Đặt tên cho kịch bản này rchmodf
, làm cho nó có thể thực thi được ( chmod a+rx /path/to/rchmodf
) và đặt nó ở đâu đó trên của bạn $PATH
.
#!/bin/sh
mode=$1; shift
find "$@" -type f -exec chmod "$mode" {} +
Giải thích: mode=$1; shift
đặt biến mode
thành đối số đầu tiên của tập lệnh và xóa đối số đầu tiên đó khỏi danh sách. "$@"
mở rộng đến danh sách tất cả các đối số.
Nếu bạn thích, bạn có thể tạo một tập lệnh chấp nhận cả chế độ thư mục và chế độ tệp.
#!/bin/sh
dir_mode=$1; shift
file_mode=$1; shift
find "$@" -type d -exec chmod "$dir_mode" {} + -o -type f -exec chmod "$file_mode" {} +
Lưu ý rằng 744 không phải là chế độ tệp hữu ích; 644 (người dùng có thể ghi và có thể đọc được trên thế giới) và 755 (cũng có thể thực hiện được trên thế giới) là phổ biến hơn nhiều. Ngoài ra, thay đổi mọi tệp trong cây để có thể thực thi hoặc không thực thi được hiếm khi hữu ích; có lẽ bạn sẽ muốn gọi tập lệnh này bằng các đối số như +rX
(viết hoa X
, để chỉ thiết lập bit thực thi cho các thư mục và cho các tệp đã được thực thi). Trong thực tế, X
chế độ biểu tượng có lẽ là những gì bạn đã có sau các tập lệnh này : chmod -R +rX .
.
Với bash hoặc zsh, có một cách khác để hành động đệ quy nhưng chỉ trên các thư mục. Đối với bash, bạn cần phiên bản 4 và để chạy shopt -s globstar
trước.
chmod a+rx **/*/
Trong zsh, bạn chỉ có thể hành động trên các tệp bằng cách nhập vào (.)
: chmod a+r **/*(.)
.
Tôi sẽ chuyển qua câu hỏi Nautilus.