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 find
trê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 find
trê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 -name
tham 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 *.java
dướ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.java
trong thư mục hiện tại, find
dò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ó *.java
tệ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 nullglob
tùy chọn trong Bash , ví dụ):
find
thì (vô tình, phiền bạn) thể hiện hành vi đúng.find
sẽ 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'
-follow
là 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