2011-12-22 36 views
36

Tôi có một tệp /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/HomeTìm tất cả các tệp có phần mở rộng nhất định trong Unix?

Tôi đang cố gắng tìm xem tôi có * .jdk ở bất kỳ đâu trên ổ cứng của mình không. Vì vậy, tôi thực hiện lệnh tìm kiếm:

find . -name "*.jdk" 

Nhưng nó không tìm thấy bất kỳ thứ gì. Không, ngay cả cái tôi biết tôi có. Làm thế nào mà?

Trả lời

70

find . chỉ trông trong thư mục hiện tại của bạn. Nếu bạn có quyền truy cập để tìm kiếm tập tin trong thư mục khác (truy cập root) sau đó bạn có thể sử dụng sau đây để tìm tập tin của bạn -

find/-type f -name "*.jdk" 

Nếu bạn đang gặp phải rất nhiều Permission denied thông điệp sau đó bạn có thể ngăn chặn điều đó bằng cách làm

find/-type f -name "*.jdk" 2> /dev/null 
+3

@Prostak, điều này sẽ chỉ hiển thị các tệp thông thường chứ không hiển thị các thư mục. '-type f' là để lọc ra các liên kết tượng trưng, ​​thư mục, thiết bị, và như vậy. – BRFennPocock

+0

Tôi đánh dấu câu trả lời này là câu trả lời chính xác. Nhưng nhờ cả hai bạn vì sự giúp đỡ của bạn! – Prostak

4

Có lẽ JDK của bạn là chữ hoa và/hoặc phiên bản find có sẵn trên OS X không mặc định là -print nếu không có hành động nào được chỉ định; thử:

find . -iname "*.jdk" -print 

(-iname là như -name nhưng thực hiện so khớp case-insensitive; -print nói với find để in ra kết quả)

--- EDIT ---

Theo ghi nhận của @Jaypal, rõ ràng là find . ... chỉ nhìn vào thư mục hiện tại (và thư mục con), nếu bạn muốn tìm kiếm toàn bộ ổ đĩa, bạn phải chỉ định / làm đường dẫn tìm kiếm.

+1

Tại sao bạn phải sử dụng '-print', isn' t mặc định? –

+1

@giannischristofakis: chỉ cần kiểm tra tiêu chuẩn POSIX, có, đó là mặc định; có lẽ tôi đã viết nó một cách rõ ràng bởi vì tôi sợ đó là một chủ nghĩa GNU mà tôi đã từng sử dụng (ví dụ, trong GNU tìm thấy bạn cũng có thể bỏ qua '.', trong khi IIRC trong BSD tìm thấy nó là bắt buộc). –

2

'.' bạn đang sử dụng là thư mục hiện tại. Nếu bạn đang bắt đầu trong thư mục nhà của bạn, nó có thể sẽ bỏ lỡ các tập tin JDK.

tìm kiếm Trường hợp xấu nhất là bắt đầu từ gốc

find/-name '*.jdk' -o -name '*.JDK' -print 

Nếu không thay thế '/' với một số con đường bạn chắc chắn nên mẹ cho bạn file JDK.

Tôi hy vọng điều này sẽ hữu ích.

8

a/

find . có nghĩa là "tìm (bắt đầu trong thư mục hiện tại)". Nếu bạn muốn tìm kiếm toàn bộ hệ thống, hãy sử dụng find /; để tìm kiếm dưới /System/Library, sử dụng find /System/Library vv

b/

Đó là an toàn hơn để sử dụng dấu nháy đơn xung quanh ký tự đại diện. Nếu không có tệp nào có tên *.jdk trong thư mục làm việc khi bạn chạy này, sau đó find sẽ nhận được một dòng lệnh của:

find . -name *.jdk 

Tuy nhiên, nếu bạn xảy ra để có file junk.jdkfoo.jdk trong thư mục hiện khi bạn chạy nó, Thay vào đó, find sẽ được bắt đầu bằng:

find . -name junk.jdk foo.jdk 

… mà sẽ (do có hai) gây nhầm lẫn và làm cho lỗi đó bị lỗi. Nếu bạn sau đó xóa foo.jdk và làm điều tương tự một lần nữa, bạn phải

find . -name junk.jdk 

... mà sẽ không bao giờ tìm thấy một file có tên (ví dụ) 1.6.0.jdk.

Những gì bạn có thể muốn trong bối cảnh này, là

find /System -name '*.jdk' 

... hay, bạn có thể "thoát" các * như:

find /System -name \*.jdk 
Các vấn đề liên quan