Chế độ đệ quy chỉ hoạt động trên các thư mục, không phải tệp. Bằng cách sử dụng toàn cầu '* .pdf', shell sẽ chuyển danh sách tệp sang chown, trong đó thấy đây là các tệp và thay đổi các quyền trên các tệp mà nó nhìn thấy và đó là nó.
Hãy nhớ rằng, trong shell, toàn cầu được đánh giá bằng shell chứ không phải lệnh. Nếu quả cầu khớp với các tệp, chúng được truyền cho lệnh và lệnh không bao giờ biết một quả địa cầu tồn tại. (Điều này khác với cách Windows Command prompt được sử dụng để thực hiện). Nếu bạn có một thư mục, với nội dung như:
machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/
Và bạn đã gõ:
chown -R someuser:somegroup *.pdf
Shell đầu tiên sẽ tạo danh sách:
file1.pdf file2.pdf
và sau đó chạy lệnh của bạn:
chown -R someuser:somegroup file1.pdf file2.pdf
Xem, không có thư mục cho -R để hành động. Nó thực hiện những gì bạn yêu cầu - thay đổi quyền sở hữu trên hai tệp trên dòng lệnh, bỏ qua cờ -R kỳ quặc đó.
Để làm những gì bạn muốn, để sử dụng '* .pdf' làm mẫu cho thư mục và thư mục con này, bạn có thể sử dụng find
, có thể tìm thấy các tệp khớp với mẫu tên tệp (hoặc nhiều tiêu chí khác) và chuyển đến một tiểu ban
find . -type f -name '*.pdf' | xargs chown someuser:somegroup
Điều này bắt đầu trong thư mục hiện tại '.' để tìm tập tin (filetype f) của mẫu tên '*.pdf'
sau đó chuyển đến xargs, nó xây dựng một dòng lệnh để chmod. Chú ý các trích dẫn xung quanh mẫu '*.pdf'
, hãy nhớ rằng shell sẽ tạo một quả địa cầu nếu có thể, nhưng bạn muốn mô hình được truyền đến find
, vì vậy bạn cần phải trích dẫn nó.
Vì tên tệp có thể có khoảng trắng trong chúng, bạn muốn sử dụng một mẹo để làm cho tên tệp có dấu cách an toàn:
find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup
Trong bash 3 trở xuống, đây là cách bạn cần làm. Globing mạnh hơn có sẵn trong bash 4 (với shopt -s globstar
) và các vỏ khác. Tương tự trong zsh, sử dụng một đệ quy toàn cầu **
:
chown -R someuser:somegroup ./**/*.pdf
shopt -s globstar
không đệ quy địa cầu.