2009-07-22 18 views
53

Tôi cần sử dụng chmod để thay đổi tất cả các tệp đệ quy thành 664. Tôi muốn bỏ qua các thư mục. Tôi đã nghĩ đến việc làm một cái gì đó như thế nàythay đổi chmod cho các tệp nhưng không phải thư mục

ls -lR | grep ^-r | chmod 664 

này không làm việc, tôi giả vì tôi không thể ống vào chmod Bất cứ ai biết một cách dễ dàng để làm điều này?

Cảm ơn

+1

này nên được hỏi trong ServerFault – MoshiBin

+0

chmod thực sự sẽ có thể phân biệt giữa các tập tin, liên kết, và thư mục trên riêng của nó. – Xeoncross

Trả lời

82

Câu trả lời là find -exec là câu trả lời hay nhất nhưng nó bị thiếu hụt thường không liên quan đến việc tạo ra một quy trình con riêng biệt cho từng tệp. Tuy nhiên, chức năng này hoàn toàn hoạt động và sẽ chỉ hoạt động kém khi số lượng tệp nhận được thực sự là lớn. Sử dụng xargs sẽ nhóm các tên tệp thành các nhóm lớn trước khi chạy một quy trình con cho nhóm của tệp đó.

Bạn chỉ cần cẩn thận khi sử dụng xargs, bạn xử lý đúng tên tệp với không gian được nhúng, dòng mới hoặc các ký tự đặc biệt khác trong chúng.

Một giải pháp có thể giải quyết tất cả những vấn đề này là (giả sử bạn có một phong nha đủ findxargs thực hiện):

find . -type f -print0 | xargs -0 chmod 644 

Các -print0 nguyên nhân find chấm dứt tên tập tin vào hoạt động sản xuất của mình với một ký tự NUL (chứ không phải là một không gian) và -0 đến xargs cho phép nó biết rằng nó sẽ mong đợi rằng như là định dạng đầu vào.

+0

Điều này thật tuyệt vời đối với GNU nhưng không may -print0 và xargs -0 không phải là tiêu chuẩn và không hoạt động, ví dụ: trên Solaris. Vì vậy, trong trường hợp đó sử dụng một trong các giải pháp khác. – mark4o

+1

Tôi có thể xác nhận rằng phương pháp này hoạt động trên Mac OSX (ít nhất là 10,9). –

+0

@ mark4o, bạn không bị giới hạn sử dụng các phiên bản braindead đi kèm với Solaris. Một ưu điểm lớn của PMNM là bạn có thể chuyển nó sang bất kỳ hệ điều hành gần đúng (UNIXy) nào. Tôi thường làm điều đó cho AIX mỗi phiên bản-5L. – paxdiablo

27

Một cách khác để làm điều này là sử dụng find ... -exec ... như sau:

find . -type f -exec chmod 644 {} \; 

Vấn đề là các -exec bắt đầu một quá trình chmod cho mỗi tập tin. Cách tiếp cận xargs tránh điều này và vượt trội với điều kiện là bạn có phiên bản findxargs có thể đối phó với sự cố "không gian trong tên đường dẫn"; xem câu trả lời được chấp nhận.

Và đối với bản ghi, việc sử dụng dấu tích sẽ bị ngắt nếu có quá nhiều tệp được mã hóa hoặc độ dài tổng hợp của tên đường dẫn quá lớn.

+1

sự khác nhau giữa \ và '+' là gì? –

+2

@HowChen - Đọc 'man find'. –

+2

Thực ra ... đó là sự khác biệt giữa ';' và '+;'. Dấu gạch chéo ngược là vỏ thoát. –

2

với GNU tìm

find /path -type f -exec chmod 644 {} +;

13

ngắn gọn hai xu của tôi ...

Linux:

$ chmod 644 `find -type f` 

OSX:

$ chmod 644 `find . -type f` 

này hoạt động để đệ quy thay đổi tất cả các file chứa trong thư mục hiện hành và tất cả các thư mục con của nó. Nếu bạn muốn nhắm đến một thư mục khác nhau, thay . với đường dẫn chính xác:

$ chmod 644 `find /home/my/special/folder -type f` 
+0

làm cách nào để bạn chỉ định thư mục nào? –

+1

Câu trả lời ban đầu của tôi bao gồm những gì OP đã hỏi về: đệ quy thay đổi tất cả các tệp trong thư mục hiện tại. Xem chỉnh sửa của tôi về cách áp dụng điều này cho bất kỳ thư mục nào, không chỉ thư mục hiện tại. –

+1

Cảm ơn bạn vì giải pháp đơn giản và ngắn nhất – asherrard

Các vấn đề liên quan