Toán tử ưu tiên trong một lệnh find?


9

Xem ví dụ dưới đây:

$ ls -1p
appledir/
applefile
orangedir/
orangefile
$ find . -type f -name apple\*
./applefile
$ find . -type f -name orange\*
./orangefile
$ find . -type f -name apple\* -o -name orange\*
./applefile
./orangedir
./orangefile
$ find . -type f \( -name apple\* -o -name orange\* \)
./applefile
./orangefile
$ 

Tôi đã ngạc nhiên khi phát hiện ra rằng tôi cần các dấu ngoặc đơn để nó hoạt động như mong đợi; rõ ràng là tôi đã không tiếp thu quy tắc ưu tiên bằng cách findđánh giá các đối số của nó.

Làm thế nào tôi có thể dễ dàng dự đoán khi nào tôi sẽ và khi nào tôi sẽ không cần sử dụng dấu ngoặc đơn để nhóm một cách rõ ràng find?

Nói cách khác, các quy tắc mà tôi có thể tưởng tượng khi find chèn dấu ngoặc đơn vào các lệnh tôi đưa ra là gì, điều này sẽ cho phép tôi dự đoán chính xác cách nó sẽ đánh giá các biểu thức không được nhóm?



Cảm ơn, @ StéphaneChazelas; đó thực sự là một nhiều thảo luận đầy đủ hơn và câu trả lời cho câu hỏi này tương tự.
tự đại diện

Câu trả lời:


9

Theo tài liệu ,

Xin lưu ý rằng -akhi được chỉ định ngầm định (ví dụ: bằng hai thử nghiệm xuất hiện mà không có toán tử rõ ràng giữa chúng) hoặc rõ ràng có độ ưu tiên cao hơn -o. Điều này có nghĩa là find . -name afile -o -name bfile -printsẽ không bao giờ in afile.

Vì vậy, về cơ bản, bạn có thể tưởng tượng findxung quanh bất kỳ hai biểu thức "anded" nào với dấu ngoặc đơn theo mặc định. Của bạn

find . -type f -name apple\* -o -name orange\*

được hiểu là

find . \( -type f -name apple\* \) -o -name orange\*

1
điều này có nghĩa là tìm thấy không phân biệt giữa testhoặc actionmã thông báo? và chỉ cần xem xét toán hạng đánh giá truehoặc falsetheo cách tương tự testtrong tập lệnh shell?
the_velour_fog

3
@the_velour_fog điều đó đúng; trong thực tế hành động cũng trả về đúng hay sai tùy thuộc vào việc họ thành công.
Stephen Kitt

ah thats những gì tôi phải vật lộn để hiểu, tôi luôn cho rằng findcó thể đã được điều trị testactionbầu cử sơ bộ khác nhau, cách một trình biên dịch sẽ nhận ra và loại biến điều trị như mảng, int và chuỗi khác nhau. nhưng bạn thực sự cần phải đối xử findnhư một ngôn ngữ lập trình nhỏ của nó và tự quản lý các toán tử và tự vận hành, cảm ơn
the_velour_fog

2
@the_velour_fog, từ Unix Power Tools, Phiên bản thứ 3 : Công việc của " findlà đánh giá các biểu thức - không định vị tệp. Vâng, findchắc chắn định vị các tệp; nhưng đó thực sự chỉ là tác dụng phụ. Đối với tôi, hiểu điểm này là bước đột phá về mặt khái niệm tạo ra findnhiều hữu dụng hơn."
tự đại diện

@wildcard, có nhận được rằng nó thực sự là một đánh giá biểu thức điều kiện là quan trọng. theo câu hỏi của bạn - và thách thức của tôi - là làm thế nào để các quy tắc hoạt động. so sánh lệnh find với biểu thức điều kiện shell (mặc dù phức tạp hơn nhiều so với bình thường) là điều mà bước đột phá của tôi là tìm thấy. Nó cũng giúp với lập trình chung của tôi quá.
the_velour_fog
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.