Câu trả lời:
Bạn có thể dùng find
để tìm kiếm tất cả các tệp không khớp với tên tệp đã cho và exec
một lệnh trên tất cả các tệp như vậy được tìm thấy như:
Giả sử bạn cần loại trừ thư mục test
và cấp quyền 755 cho tất cả các tệp và thư mục khác. Điều này sẽ được thực hiện từ ngọn cây.
find ! -name test -exec chmod 755 {} \;
mtk@mtk4-laptop:$ touch a1.txt a2.txt a3.txt test
mtk@mtk4-laptop:$ ls -lrt
total 0
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 test
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 a3.txt
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 a2.txt
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 a1.txt
mtk@mtk4-laptop:$ find ! -name test -exec chmod 777 {} \;
mtk@mtk4-laptop:$ ls -lrt
total 0
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 test
-rwxrwxrwx 1 mtk mtk 0 Sep 17 23:55 a3.txt*
-rwxrwxrwx 1 mtk mtk 0 Sep 17 23:55 a2.txt*
-rwxrwxrwx 1 mtk mtk 0 Sep 17 23:55 a1.txt*
mtk@mtk4-laptop:$
Các quyền cho tập tin test
vẫn không thay đổi. Tương tự được áp dụng cho các thư mục.
mkdir test
+ touch a1.txt a2.txt a3.txt
, và sau đó thực hiện lệnh.
Cái quái gì vậy?
Nếu bạn đang chạy bash (có thể nếu bạn đang sử dụng Linux), bạn có thể kiểm tra extglob, cung cấp cho bạn nhiều tùy chọn hơn cho toàn cầu hóa, bao gồm cả "toàn cầu âm" !()
shopt -s extglob
chmod 774 !(file-to-ignore)
Sử dụng find
đơn giản hơn như thế này:
find <from_where_to_change> -not -path "*/<excluded_dir_name>*" [-and -not -path "*/<another_excluded_dir_if_you_want>*"] -exec chown <user>[:<group>] {} \;
Trong trường hợp của tôi, đó là:
find /data/project -not -path "*/.svn*" -exec chown :www-data {} \;
Bằng cách này, tôi đã thay đổi đệ quy nhóm trên thư mục / dữ liệu / dự án, ngoại trừ tất cả các thư mục ".svn" theo cách đệ quy.
Tôi đang sử dụng lệnh dưới đây, nó sẽ cung cấp các tệp 644 và thư mục 755 cho tất cả các tệp và thư mục trong thư mục làm việc hiện tại nhưng sẽ loại trừ thư mục var để cung cấp quyền.
find . -not -path "*/var*" -type f -exec chmod -c 0644 {} \; && find . -not -path "*/var*" -type d -exec chmod -c 0775 {} \;
grep -v "directory to exclude"