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


248

Tôi đã có một thư mục được gọi là pdfs có chứa một loạt các thư mục con và thư mục con. 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 nam 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ì?

Câu trả lời:


257

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

1
Đã chỉnh sửa để phản ánh rằng bash 4 với shopt -s globstar không đệ quy địa cầu.
kojiro

@kojiro cảm ơn! như bạn có thể nói tôi vẫn sử dụng bash3
Rich Homolka

2
Trên trang man hiển thị bởi poster gốc, tôi 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 bạc hà 15.
gwideman

@gwideman Tôi biết điều này đã cũ ... Nhưng vâng, tất nhiên -R không đệ quy. OP chỉ gặp sự cố với một kiểu đệ quy rất cụ thể, phần mở rộng và "loại tệp là tệp" được lọc
Rich Homolka

@RichHomolka À. OP cho biết các tệp nằm trong một thư mục có tên 'pdf', vì vậy tôi cho rằng vấn đề là ở chỗ chỉ định pdf là thư mục để lặp lại và tất cả các tệp có chứa đều là pdf, do đó 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 chỉ chọn các tệp pdf và không thay đổi các tệp khác.
gwideman

39

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 và tất cả các thư mục con và thư mục con của thư mục được chỉ định. Sử dụng cẩn thận.


Rõ ràng có người trả lời nó từ 4 năm nay, nhưng buộc phải cảnh báo.
Francisco Tapia

2
Câu hỏi này hiện đang là số 1 trên Google, vì vậy điều quan trọng cần lưu ý câu trả lời chính xác.
Sprachprofi

chắc chắn, một trong những được chấp nhận là thanh lịch hơn, dễ đọc và đầy đủ
Francisco Tapia

2
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

1
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ự tồi tệ hơn một chút so với những gì OP đã thử.
Rich Homolka

14

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

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

Xin đừng quên các trích dẫn xung quanh *.pdf. Nếu không thì vỏ sẽ cố gắng mở rộng nó. Điều này có nghĩa là vỏ 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à điều bạn muốn. Bạn muốn tìm các tệp PDF nằm trong thư mục con. Btw.: Đó cũng là vấn đề với bạn chown chỉ huy.


1
Tôi đã phải tìm kiếm +, thủ thuật gọn gàng cho hiệu suất. -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 nối thêm từng tên tệp đã chọn ở cuối; tổng số lệnh gọi của lệnh sẽ ít hơn nhiều so với số lượng tệp được khớ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 bắt đầu.
Patrick M

@PatrickM một (nhỏ) lợi thế khác để + vs; .... cộng với isn, một nhân vật meta shell và không cần phải thoát
Rich Homolka

6

Lệnh

chown -R someuser:somegroup *.pdf

sẽ chỉ lặp lại các 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 {} \;

Về mặt kỹ thuật, nó sẽ chỉ đi 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

0

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

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

tên người dùng ở đâ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 có chủ sở hữu người dùng và chủ sở hữu nhóm


Điều này không làm những gì OP yêu cầu. Điều này thay đổi quyền sở hữu mọi thứ, OP yêu cầu một bộ tệp cụ thể.
Rich Homolka

0

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

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

Ngoài ra, hãy 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

Để trở thành chủ sở hữu của tất cả các tệp trong một thư mục, hãy sử dụng

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER

thay vì

sudo chown $USER directory\*

hoặc là

sudo chown --recursive $USER directory

có thể không hoạt động nếu có quá nhiều đối số được tạo bởi * (quá nhiều tệp trong thư mục) hoặc không làm được những gì bạn muốn tương ứng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.