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.
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.
Câu trả lời:
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ụ):
findthì (vô tình, phiền bạn) thể hiện hành vi đúng.findsẽ phàn nàn rằng nó thiếu đối số -name.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'
-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.
Thoát khỏi *
find . -name \*.java