2009-03-18 5 views
30

Trong trình chỉnh sửa/id chẳng hạn như nhật thực và văn bản, có các phím tắt để tìm nhanh một tệp cụ thể trong thư mục dự án.Tìm tệp trong thư mục từ dòng lệnh

Có công cụ tương tự để thực hiện hoàn thành toàn bộ đường dẫn trên tên tệp trong thư mục (đệ quy), trong bash hoặc trình bao khác không?

Tôi có các dự án có rất nhiều thư mục và những dự án sâu sắc ở đó (tiếng thở dài, java). Hitting tab trong vỏ chỉ chu kỳ qua các file trong thư mục ngay lập tức, đó là chưa đủ =/

+0

Bản sao có thể có của [Làm cách nào để tìm tất cả các tệp có chứa văn bản cụ thể trên Linux?] (Https://stackoverflow.com/questions/16956810/how-do-i-find-all-files-containing-specific-text -on-linux) – Bruno

Trả lời

53
find /root/directory/to/search -name 'filename.*' 
# Directory is optional (defaults to cwd) 

chuẩn UNIX globbing được hỗ trợ. Xem man find để biết thêm thông tin.

Nếu bạn đang sử dụng Vim, bạn có thể sử dụng:

:e **/filename.cpp 

Hoặc :tabn hoặc bất kỳ lệnh Vim mà chấp nhận một tên tập tin.

+0

@Bryan Oakley, Cảm ơn bạn đã chỉnh sửa, nhưng nó đã ghi đè phần bổ sung của tôi về Vim! Tôi đã viết lại đối số thư mục trong câu trả lời của mình. Cảm ơn. – strager

+0

Cảm ơn mẹo vim. Đó là một trong những hữu ích tôi vẫn không biết: P – skinp

+1

Có anyway để làm điều này trong thư mục hiện tại mà không cần gõ nó ra tất cả các cách? –

0

Có, bash có cơ chế hoàn tất tên tệp. Tôi không sử dụng chúng bản thân mình (quá lười biếng để tìm hiểu, và tôi không tìm thấy nó cần thiết thường xuyên đủ để làm cho nó khẩn cấp), nhưng cơ chế cơ bản là gõ vài ký tự đầu tiên, và sau đó một tab; điều này sẽ mở rộng tên như xa như nó có thể (có lẽ không phải ở tất cả) miễn là tên là rõ ràng. Có một loạt các lệnh kiểu Emacs liên quan đến việc hoàn thành trong trang người đàn ông tốt.

2

Khi tôi ở thế giới UNIX (sử dụng tcsh (sigh ...)), tôi đã sử dụng tất cả các loại "tìm" bí danh/tập lệnh thiết lập để tìm kiếm tệp. Tôi nghĩ rằng mặc định "tìm" cú pháp là một chút phiền phức, vì vậy tôi đã từng có bí danh/script để ống vào grep, cho phép bạn sử dụng biểu thức thông thường để tìm kiếm "tìm -print.":

# finds all .java files starting in current directory 
find . -print | grep '\.java' 

#finds all .java files whose name contains "Message" 
find . -print | grep '.*Message.*\.java' 

Trong số Tất nhiên, các ví dụ trên có thể được thực hiện với tìm kiếm đồng bằng cũ, nhưng nếu bạn có một tìm kiếm cụ thể hơn, grep có thể giúp khá nhiều. Điều này hoạt động khá tốt, trừ khi "tìm. -print" có quá nhiều thư mục để recurse thông qua ... sau đó nó được khá chậm. (ví dụ, bạn sẽ không muốn làm điều này bắt đầu trong thư mục gốc "/")

7

Nếu bạn muốn làm điều gì đó với danh sách tệp, bạn có thể sử dụng kết hợp với cấu trúc bash $() (tốt hơn backticks vì nó được phép lồng). Ví dụ:

ví dụ: bạn đang ở cấp cao nhất trong thư mục dự án của mình và bạn muốn danh sách tất cả các tệp C bắt đầu bằng "btree". Lệnh:

find . -type f -name 'btree*.c' 

sẽ trả về danh sách. Nhưng điều này không thực sự giúp đỡ với việc làm một cái gì đó với họ.

Vì vậy, hãy tiếp tục giả sử bạn muốn tìm kiếm tất cả các tệp đó cho chuỗi "L ERI" hoặc chỉnh sửa tất cả. Bạn có thể thực hiện một trong số:

grep ERROR $(find . -type f -name 'btree*.c') 
vi $(find . -type f -name 'btree*.c') 

để thực hiện việc này.

1

Tôi sử dụng tính năng này script để tìm nhanh các tệp trên các thư mục trong một dự án.Tôi đã tìm thấy nó hoạt động tuyệt vời và tận dụng lợi thế của tự động hoàn thành của Vim bằng cách mở và đóng một bộ đệm mới cho tìm kiếm. Nó cũng thông minh hoàn thành càng nhiều càng tốt cho bạn vì vậy bạn thường có thể chỉ cần gõ một hoặc hai ký tự và mở tập tin trên bất kỳ thư mục trong dự án của bạn. Tôi bắt đầu sử dụng nó đặc biệt vì một dự án Java và nó đã tiết kiệm cho tôi rất nhiều thời gian. Bạn chỉ cần xây dựng bộ nhớ cache một lần khi bạn bắt đầu phiên soạn thảo của bạn bằng cách gõ: FC (tên thư mục). Bạn cũng có thể sử dụng. để có được thư mục hiện tại và tất cả các thư mục con. Sau đó bạn chỉ cần gõ: FF (hoặc FS để mở một phân chia mới) và nó sẽ mở ra một bộ đệm mới để chọn tập tin bạn muốn. Sau khi bạn chọn tệp, bộ đệm tạm thời đóng và bạn đang ở trong tệp được yêu cầu và có thể bắt đầu chỉnh sửa. Ngoài ra, here là một liên kết khác trên Stack Overflow có thể hữu ích.

0

locate <file_pattern>

*** find chắc chắn sẽ làm việc, và có thể nhắm mục tiêu các thư mục cụ thể. Tuy nhiên, lệnh này chậm hơn lệnh locate. Trên hệ điều hành Linux, mỗi ngày một cơ sở dữ liệu được xây dựng chứa danh sách tất cả thư mục và tệp và lệnh locate tìm kiếm cơ sở dữ liệu này hiệu quả, vì vậy nếu bạn muốn tìm kiếm các tệp không được tạo hôm nay, cách nhanh nhất để thực hiện một tác vụ như vậy.