2012-04-06 23 views
6

Tôi thường sử dụng như thế nàyvi mở với tên tập tin thông qua

$ find -name testname.c 
./dir1/dir2/testname.c 
$ vi ./dir1/dir2/testname.c 

nó để gây phiền nhiễu để gõ tên tập tin với vị trí một lần nữa.

làm cách nào tôi có thể thực hiện việc này chỉ với một bước?

Tôi đã thử

$ find -name testname.c | xargs vi 

nhưng tôi đã thất bại.

+0

có thể trùng lặp: http://stackoverflow.com/questions/5955577/bash-automatically-capture-output-of-last -executed-command-into-a-variable –

+0

Câu trả lời này giải thích tại sao giải pháp 'xargs' không hoạt động: [Tại sao" định vị tên tệp | xargs vim ”gây ra hành vi đầu cuối lạ?] (http://stackoverflow.com/a/8228888/85371) – sehe

Trả lời

10

Sử dụng thông số -exec để find.

$ find -name testname.c -exec vi {} \; 

Nếu số find trả về nhiều kết quả, các tệp sẽ được mở tuần tự. Đó là, khi bạn đóng một, nó sẽ mở tiếp theo. Bạn sẽ không nhận được tất cả chúng xếp hàng trong bộ đệm.

Để có được tất cả chúng mở trong bộ đệm, sử dụng:

$ vi $(find -name testname.c) 

Đây có phải là thực sự vi, bằng cách này, và không Vim, mà vi thường aliased hiện nay?

+0

Thêm + thay vào đó \; để tìm thấy sẽ tốt hơn cho việc mở nhiều tệp. + cú pháp được xác định bởi POSIX và sẽ có sẵn. – jordanm

4

Vấn đề là xargs tiếp quản tất cả các đầu vào vi 's ở đó (và, không có cách nào khác, sau đó đi vào /dev/null-vi vì thay thế được đi qua phần còn lại của danh sách tập tin), để lại không có cách nào để bạn có thể tương tác với nó. Bạn có thể muốn sử dụng một subcommand thay vì:

$ vi $(find -name testname.c) 

Đáng buồn là không có đơn giản fc hoặc r gọi có thể làm điều này cho bạn một cách dễ dàng sau khi bạn đã chạy ban đầu find, mặc dù nó đủ dễ dàng để thêm các nhân vật cho cả hai kết thúc của lệnh sau khi thực tế.

+0

Tôi có thể hỏi bạn điều gì không ?. bạn có nghĩa là 'xargs' vượt qua không chỉ'./dir1/dir2/testname.c' trong ví dụ này? –

+0

Mô tả tệp được kế thừa; thông thường 'vi' thừa hưởng đầu vào của nó từ trình bao, mà đầu vào của nó là đầu cuối của bạn, nhưng khi bạn sử dụng' xargs' ở cuối đường ống, đầu vào kế thừa sẽ là đường dẫn. 'xargs' không muốn cung cấp đường dẫn cho chương trình đang chạy (vì tốt nhất là truyền một đường ống tiêu thụ và tồi tệ nhất chương trình sẽ tiêu thụ đầu vào dành cho' xargs') để nó thay thế '/ dev/null'. – geekosaur

3

giải pháp ưa thích của tôi là sử dụng vim bản thân: vỏ

:args `find -name testname.c` 

Ngẫu nhiên, VIM đã mở rộng globbing dựng sẵn, vì vậy bạn chỉ có thể nói

:args **/testname.c 

mà sẽ tìm cách đệ quy trong cây thư mục phụ .

Không còn, VIM có hoàn filename trên dòng lệnh, vì vậy nếu bạn biết bạn đang thực sự tìm kiếm một tập tin duy nhất, hãy thử

:e **/test 

và sau đó nhấn Tab (nhiều lần) để chuyển giữa bất kỳ tên tập tin matchin trong cây thư mục con.

1

Đối với thứ gì đó mạnh mẽ hơn vi $(find -name testname.c) và các mục tương tự, phần sau sẽ bảo vệ khỏi tên tệp có khoảng trắng và các ký tự shell được giải thích khác (nếu bạn có dòng mới được nhúng vào tên tệp của mình, hãy giúp bạn). Tiêm chức năng này vào môi trường shell của bạn:

# Find a file (or files) by name and open with vi. 
function findvi() 
{ 
    declare -a fnames=() 
    readarray -t fnames < <(find . -name "$1" -print) 
    if [ "${#fnames[@]}" -gt 0 ]; then 
     vi "${fnames[@]}" 
    fi 
} 

Sau đó sử dụng như

$ findvi Classname.java 
Các vấn đề liên quan