Lệnh của bạn trước tiên được phân tách bằng shell thành hai lệnh được phân tách bằng a ;
, tương đương với một dòng mới:
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
Nếu bạn muốn chạy lệnh shell, hãy gọi shell một cách rõ ràng bằng bash -c
(hoặc sh -c
nếu bạn không quan tâm rằng shell đó là bash cụ thể):
find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;
Lưu ý việc sử dụng {}
như là một đối số cho shell; đó là đối số zeroth (thường là tên của shell hoặc script, nhưng điều này không quan trọng ở đây), do đó được tham chiếu là "$0"
.
Bạn có thể chuyển nhiều tên tệp vào shell cùng một lúc và làm cho shell lặp qua chúng, nó sẽ nhanh hơn. Ở đây tôi chuyển _
như tên tập lệnh và các đối số sau đây là tên tệp, mà for x
(một phím tắt cho for x in "$@"
) lặp lại.
find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +
Lưu ý rằng vì bash 4 hoặc trong zsh, bạn không cần tìm ở đây. Trong bash, hãy chạy shopt -s globstar
(đặt nó vào trong của bạn ~/.bashrc
) để kích hoạt **/
trạng thái đứng cho một thư mục đệ quy toàn cầu. (Trong zsh, điều này luôn hoạt động.) Sau đó
chgrp -v new_group -- **/*; chmod -v 770 -- **/*
hoặc nếu bạn muốn các tệp được lặp theo thứ tự
for x in **/*; do
chgrp -v new_group -- "$x"
chmod -v 770 -- "$x"
done
Một điểm khác biệt với find
lệnh là shell bỏ qua các tệp chấm (các tệp có tên bắt đầu bằng a .
). Để bao gồm chúng, trong bash, bộ đầu tiên GLOBIGNORE=.:..
; trong zsh, sử dụng **/*(D)
như mô hình toàn cầu.
'{}'
(dấu nháy quanh niềng răng), vui lòng truy cập: unix.stackexchange.com/q/8647/4485