Tại sao tìm thấy của tôi không đệ quy?


65

Tôi đang chạy lệnh sau, nhưng nó không được thực hiện đệ quy:

find . -name *.java

Tôi biết có những tập tin java nằm sâu hơn trong thư mục hiện tại nhưng nó chỉ thực hiện findtrên thư mục hiện tại. Tôi đang sử dụng OS X, 10.9.


@Gilles: Câu hỏi và trả lời này rõ ràng hơn và ít nội địa hóa hơn so với bản dupe - nếu một trong số chúng phải được đóng lại, thì đó là một câu hỏi khác.
goldilocks

Câu trả lời:


88

Vấn đề là, bạn đã không trích dẫn -nametham số của bạn . Thay vào đó, hãy làm điều này:

find . -name '*.java'

Giải trình

Không có dấu ngoặc kép, shell diễn giải *.javadưới dạng mẫu toàn cục và mở rộng nó thành bất kỳ tên tệp nào khớp với toàn cầu trước khi chuyển nó sang find. Bằng cách này, nếu bạn có, giả sử, foo.javatrong thư mục hiện tại, finddòng lệnh thực tế sẽ là:

find . -name foo.java

trong đó rõ ràng sẽ chỉ liệt kê tệp trong thư mục hiện tại (trừ khi bạn có một số tệp có tên tương tự ở dưới cây).

Trích dẫn ngăn chặn sự mở rộng toàn cầu và chuyển dòng lệnh về nguyên trạng find.

Ngẫu nhiên, nếu quả cầu không khớp (không có *.javatệp nào trong thư mục hiện tại), bạn sẽ có một trong hai hành vi tùy thuộc vào cách trình bao của bạn được thiết lập để xử lý các khối không khớp (điều này được điều chỉnh bởi nullglobtùy chọn trong Bash , ví dụ):

  1. Nếu một quả cầu không khớp không được mở rộng bằng vỏ, findthì (vô tình, phiền bạn) thể hiện hành vi đúng.
  2. Nếu một quả cầu không khớp được mở rộng thành một chuỗi rỗng bằng vỏ, findsẽ phàn nàn rằng nó thiếu đối số -name.

20

Tôi đã có một tình huống tương tự khi tôi đang xoay quanh giá trị -name trong dấu ngoặc kép, nhưng vẫn không nhận được tất cả các lượt truy cập mà tôi hy vọng. Tôi phỏng đoán rằng đó là vì liên kết tượng trưng và chắc chắn đó là trường hợp. Nếu bạn muốn buộc tìm kiếm thông qua các liên kết tượng trưng, ​​bạn có thể sửa đổi lệnh thành như sau:

find -L . -name '*.java'

Symlinks là vấn đề của tôi quá. -followlà một từ đồng nghĩa dễ đọc hơn -L, miễn là bạn đặt nó trước các thông số khác.
Noumenon

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.