2009-03-22 36 views
10

Lệnh find có vẻ khác với các lệnh Unix khác.Không thể hiểu được cú pháp của lệnh tìm thấy

Tại sao có các dấu ngoặc nhọn trống và đèn flash ngược ở cuối lệnh sau?

find * -perm 777 -exec chmod 770 {} \; 

tôi tìm thấy một lý do cho dấu ngoặc nhọn nhưng không phải cho đèn flash phía sau.

Các dấu ngoặc nhọn là rõ ràng cho con đường

Tương tự như exec, ngoại trừ '' {} '' là thay thế với càng nhiều tên đường dẫn như nhất có thể cho mỗi lời gọi của tiện ích

+2

Niềng răng cũng cho phép bạn chạy các lệnh không mong đợi (hoặc yêu cầu) tên tệp làm đối số cuối cùng. Bạn có thể sử dụng niềng răng để chèn tên tập tin bất cứ nơi nào bạn muốn, ngay cả khi tên của chương trình để thực thi! –

+0

có thể trùng lặp của [Lệnh unix đơn giản, {} và \; cho] (http://stackoverflow.com/questions/447048/simple-unix-command-what-is-the-and-for) – kenorb

Trả lời

2

tôi muốn khuyên bạn nên thay vì làm điều đó như

find . -perm 777 -print0 | xargs -0 chmod 770 

"xargs" nói để có những kết quả của cuộc tìm và nuôi nó 20 tại một thời điểm để các lệnh sau đây.

+1

Hai mươi lần? Nói ai? –

+0

xargs người đàn ông (của phiên bản 4.4.0) không đề cập đến số 20. Hành vi này có thể được thực thi mặc dù, bằng cách gọi xargs với -n20. – Stephan202

+0

"20 tại một thời điểm" là loại trung bình. Nó thực sự tuy nhiên nhiều như nó nghĩ có thể phù hợp trong một dòng lệnh bình thường, mà tôi nghĩ là 512 byte dài trong POSIX. –

16

Lệnh -exec có thể được theo sau bởi bất kỳ số lượng đối số nào tạo nên lệnh được thực thi cho mỗi tệp được tìm thấy. Có cần phải có một số cách để xác định đối số cuối cùng. Đây là cái gì \; làm. Lưu ý rằng những thứ khác có thể làm theo sau khi chuyển đổi exec: (. Đây tìm tất cả c-file và các file python trong thư mục Euler)

find euler/ -iname "*.c*" -exec echo {} \; -or -iname "*.py" -exec echo {} \; 

Lý do mà exec không đòi hỏi đầy đủ các lệnh để được bên trong dấu ngoặc kép, là điều này sẽ yêu cầu thoát rất nhiều dấu ngoặc kép bên trong lệnh, trong hầu hết trường hợp.

3

Dấu chấm phẩy (thoát) là cần thiết để "tìm" có thể cho biết các đối số cho chương trình exec'd kết thúc (nếu có) và các đối số bổ sung để "tìm" bắt đầu.

6

Chuỗi {} trong find được thay thế bằng tên đường dẫn của tệp hiện tại.

Dấu chấm phẩy được sử dụng để chấm dứt lệnh vỏ được gọi bởi tiện ích find.

Nó cần phải được thoát hoặc được trích dẫn, vì vậy nó sẽ không được diễn giải bởi trình bao, vì ; là một trong những ký tự đặc biệt được sử dụng bởi trình bao (toán tử danh sách).

Xem thêm: Why are the backslash and semicolon required with the find command's -exec option?

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