Câu hỏi Làm thế nào tôi có thể làm cho công việc chown đệ quy?


Tôi có một thư mục có tên pdfs có chứa một loạt các thư mục con và phụ. Tôi muốn thay đổi quyền sở hữu trên tất cả các tệp PDF trong tất cả các thư mục con. Tôi vừa thử điều này:

chown -R someuser:somegroup *.pdf

... nhưng nó không thay đổi quyền sở hữu các tệp PDF trong các thư mục con. Người dùng và nhóm tồn tại.

Theo trang người đàn ông cho chown, các -R nên có nghĩa là đệ quy:

-R, --recursive
          operate on files and directories recursively

Tôi đang thiếu gì?


227
2018-03-22 16:29


gốc




Các câu trả lời:


Chế độ đệ quy chỉ hoạt động trên các thư mục, chứ không phải tệp. Bằng cách sử dụng glob '* .pdf', trình bao sẽ chuyển danh sách tập tin sang dạng chown, đây là các tập tin, và thay đổi các quyền trên các tập tin mà nó thấy, và đó là nó.

Hãy nhớ rằng, trong shells, glob được đánh giá bởi shell, không phải lệnh. Nếu glob phù hợp với các tập tin, chúng được truyền vào lệnh và lệnh không bao giờ biết một glob tồn tại. (Điều này khác với cách nhắc lệnh Windows Command được sử dụng để làm việc). Nếu bạn có một thư mục, với nội dung như sau:

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

Hãy xem, không có thư mục cho -R để hành động. Nó làm những gì bạn hỏi nó - thay đổi quyền sở hữu trên hai tập tin trên dòng lệnh, bỏ qua lá cờ R-quirky đó.

Để thực hiện 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 thư mục con

find . -type f -name '*.pdf' | xargs chown someuser:somegroup

Điều này bắt đầu trong dir hiện tại '.' tìm kiếm tệp (filetype f) của mẫu tên '*.pdf' sau đó chuyển đến xargs, cấu trúc một dòng lệnh để chmod. Lưu ý các dấu ngoặc kép xung quanh mẫu '*.pdf', hãy nhớ rằng shell sẽ tạo ra một glob nếu nó có thể, nhưng bạn muốn pattern chuyển đến find, vì vậy bạn cần phải báo giá.

Bởi 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 an toàn với không gian:

find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup

Trong bash 3 và thấp hơn, đây là cách bạn cần làm. Globing mạnh mẽ hơn có sẵn trong bash 4 (với shopt -s globstar) và các loại vỏ khác. Tương tự trong zsh, bằng cách sử dụng một recursive glob **:

chown -R someuser:somegroup ./**/*.pdf

233
2018-03-22 16:47



Đã chỉnh sửa để phản ánh rằng bash 4 với shopt -s globstar cầu vồng đệ quy. - kojiro
@kojiro cảm ơn! như bạn có thể nói tôi vẫn sử dụng bash3 - Rich Homolka
Mỗi trang người đàn ông được hiển thị bởi poster gốc, tôi tìm thấy chown -R đã thực sự thay đổi chủ sở hữu trên các thư mục và tệp. Không cần tìm. Sử dụng Mint 15. - gwideman
@ gwideman Tôi biết điều này là cũ ... Nhưng có, tất nhiên -R không đệ quy. OP chỉ gặp vấn đề với kiểu đệ quy rất cụ thể, phần mở rộng và "tệp kiểu là tệp" được lọc - Rich Homolka
@RichHomolka Ah. OP cho biết các tập tin nằm trong một thư mục có tên là 'pdfs', vì vậy tôi cho rằng vấn đề là làm thế nào để chỉ định pdf như thư mục để recurse, và tất cả các file chứa đều là pdf, vì vậy không cần phải chọn chúng một cách cụ thể. Nhưng bạn cũng có thể đúng, nếu công việc là chỉ chọn các tệp pdf và để những người khác không thay đổi. - gwideman


Nó không phức tạp.

chown -R someuser:somegroup /your/folder/here/*

Điều này sẽ áp dụng chown cho tất cả các tập tin và tất cả các thư mục con và thư mục con phụ của thư mục được chỉ định. Sử dụng cẩn thận.


30
2017-11-09 11:44



Rõ ràng ai đó trả lời nó kể từ 4 năm, nhưng ty cho cảnh báo. - Francisco Tapia
Câu hỏi này hiện đang # 1 trên Google, vì vậy điều quan trọng cần lưu ý là câu trả lời đúng. - Sprachprofi
chắc chắn, người được chấp nhận thanh lịch, dễ đọc và hoàn chỉnh hơn - Francisco Tapia
Bằng cách nào đó sudo chown -R user ./ đã làm việc cho tôi, nhưng sudo chown -R user ./* không - Slav
Tôi biết điều này là cũ, nhưng mặc dù điều này trả lời tiêu đề, không trả lời câu hỏi. Điều này thực sự hơi tồi tệ hơn những gì OP đã thử. - Rich Homolka


Bạn có thể dùng find tiện ích:

find . -name '*.pdf' -exec chown someuser:somegroup {} +

Xin đừng quên các dấu ngoặc kép xung quanh *.pdf. Nếu không thì shell sẽ cố gắng mở rộng nó. Điều này có nghĩa là trình bao sẽ thay thế *.pdf với tên của tất cả các tệp PDF được tìm thấy trong thư mục hiện tại. Nhưng đó không phải là những gì bạn muốn. Bạn muốn tìm các tập tin PDF nằm trong thư mục con. Btw .: Đó cũng là vấn đề với bạn chown chỉ huy.


14
2018-03-22 16:37



Tôi phải tra cứu +, lừa gọn gàng để thực hiện. -exec command {} + Biến thể của hành động -exec này chạy lệnh được chỉ định trên các tệp đã chọn, nhưng dòng lệnh được xây dựng bằng cách chắp thêm từng tên tệp đã chọn ở cuối; tổng số lời gọi của lệnh sẽ ít hơn nhiều so với số lượng tệp phù hợp. Dòng lệnh được xây dựng theo cách tương tự xargs xây dựng các dòng lệnh của nó. Chỉ một trường hợp {} được cho phép trong lệnh. Lệnh được thực thi trong thư mục khởi động. - Patrick M
@ PatrickM một (nhỏ) lợi thế khác để + vs; .... plus không phải là ký tự meta shell và không cần phải thoát - Rich Homolka


Lệnh

chown -R someuser:somegroup *.pdf

sẽ chỉ recurse xuống thư mục nếu danh mục tên kết thúc bằng .pdf. Bạn cần một cái gì đó như:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;

6
2018-03-22 16:38



Về mặt kỹ thuật, nó sẽ chỉ giảm xuống một cấp. cho dù bạn gọi đó là đệ quy thực sự hay không là một bài tập cho người dùng :) - Rich Homolka


để thay đổi quyền sở hữu của một thư mục một cách đệ quy, chỉ cần sử dụng:

sudo chown -R <username>:<groupname> <dir name>

tên người dùng này = người dùng mới nên là chủ sở hữu của thư mục

groupname = nhóm mới nên là chủ sở hữu của thư mục

mỗi tệp / thư mục đều có chủ sở hữu người dùng và chủ sở hữu nhóm


0
2018-05-11 01:38



Điều này không làm những gì OP hỏi. Điều này thay đổi quyền sở hữu của tất cả mọi thứ, OP yêu cầu cho một tập hợp các tập tin cụ thể. - Rich Homolka


tôi sử dụng tree thay thế:

 sudo tree -fai ~/.blabla  | xargs -L1 -I{} sudo chown youruser:youruser {}

Cũng cẩn thận để không chạy chown đệ quy hoặc chmod trên thư mục '/' hoặc thư mục hệ thống khác.


0
2018-01-25 13:36