Birden fazla dosyayı nasıl bulabilir ve vim'de nasıl açabilirim?


10

Diyelim ki bir dosyam var filename123.txtve bu şekilde adlandırılmış tek bir dosya locateve komutla da yapabilirim locate filename123. Ve sadece bu dosyayı döndürür.

Şimdi vi/ ile açmak istiyorum vim. Ancak o konuma gitmek ve vidosya adını izleyen komutu yazmak istemiyorum . Burada sonucun locate filename123vi komutuna eklenmesini istiyorum . Bunu nasıl yapabilirim? Zaten denedim:

locate filename123 | vi

Ancak bu işe yaramıyor. Ve bu hata terminalde gelir:

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.

Yanıtlar:


12

Şunları kullanabilirsiniz xargs:

locate filename123 | xargs vi

Varsayılan xargsolarak, belirtilen komutun mümkün olduğunca az örneğini yürütür ve sistemin ARG_MAX'ına göre mümkün olduğunca çok parametre iletir . Örneğine geçirilen parametrelerin sayısını sınırlamak için vi, kullanım xargs' -nseçeneği.

Boşluk içeren dosya adlarını işlemek için xargs' -dseçeneğini kullanın:

locate filename123 | xargs -d '\n' vi

Yeni satır kullanmak içeren dosya adlarını işlemek için xargs' -0birlikte seçeneğini locates' -0seçeneği:

locate -0 filename123 | xargs -0 vi

(Hiçbirinde -0mevcut değilse , --nullkarakteri veya \000sınırlayıcı olarak belirtmenin başka bir yolunu da kontrol edin .)


Bu dosyayı açmadan önce beni neyin engellediğini söyleyebilir misiniz?
Santosh Kumar

1
@Santosh Sen çıktısını geçerken locateolarak komuta girişi vi. Vi, diğer tüm programlar gibi dosya (lar) ın da argüman olarak çalışmasını bekler.
Gilles 'SO- kötü olmayı kes

@manatwork Sorun, içinde boşluk bulunan dosya adını bulamıyorum ve açamıyorum. Örneğin bu komut vim içinde birden fazla dosya açar: locate I \ have \ to \ download | xargs vi
Santosh Kumar

3

Komut genişletmeyi kullanabilirsiniz:

vi "$(locate filename123 | head -n1)"

Yapmak için vimyapabileceğiniz onun Stdin okumak vim -, ama bu sadece size çıktısını verecektir locatedosya yolları olan. Bu vim gfnormal bir komutun kullanılmasıyla imlecin açık olduğu yolu açacaktır.

Düzenle

İçinde boşluk bulunan dosya adları xargssöz konusu olduğunda veya vimyukarıda açıklanan çözümü kullanmanız daha iyi olur . gfİş yapmak için şunlara yer eklemeniz gerektiğini unutmayın isfname:

set isfname+=32

Bu ipucu ve alternatifler burada açıklanmaktadır .

Düzenle 2

Tırnak işaretleri eklendi ve yorumlardahead PeterO tarafından önerildiği gibi .


İçinde boşluk bulunan dosya için, dosya adına \ eklediğimde vi $ gibi (başka bir dosya bul). Vim dosyayı iki ayrı dosya olarak açar anotherve file:(.
Santosh Kumar

Yanıtınız yalnızca dosyada bulduğum boşluk olmadığında çalışır.
Santosh Kumar

Yanıt güncellendi.
Thor

2
@Thor: Tek bir dosya için, soruda belirtildiği gibi, işlem ikamesi etrafındaki alıntıları sarmanız yeterlidir: vi "$(locate filename123)"... Bununla başa çıkmak için sadece bir dosya adı olduğundan emin olmak için :vi "$(locate filename123 |head -n1)"
Peter.O

PeterO: Haklısın, sadece birden fazla isabetle test ettim. Cevabınıza yorumlarınızı ekledim.
Thor

1

En basit yol, kabuk ikamesilocate olarak geçmek , örneğin:

vim $(locate filename123)

Düzenlemek için dosya adlarını iletmek findyerine kullanmayı da düşünebilirsiniz locate, örneğin:

find . -name 'filename123' -exec vim {} +

Unix / OSX üzerinde kullanabilirsiniz xargsile -o, parametre gibi:

locate filename123 | xargs -o vim

-oKomutu çalıştırmadan önce stdin'i alt süreçte / dev / tty olarak yeniden açın. Bu, xargs'ın etkileşimli bir uygulama çalıştırmasını istiyorsanız kullanışlıdır.

Veya Linux'ta aşağıdakileri kullanarak aşağıdaki geçici çözümü deneyin:

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

Farklı komutlar kullanıyorsanız, bunu başarmak için komut yerine kullanın:

vim $(locate filename123)
vim `locate filename123`

Alternatif olarak , tty tahsisini zorlamak parallelyerine GNU kullanın, xargsörneğin:

locate filename123 | parallel -X --tty vi

Not: parallelUnix / OSX'te farklı parametreleri olduğundan ve tty'yi desteklemediğinden çalışmaz.

İyi (gibi birçok diğer popüler komutlar sözde tty tahsisini sağlayan -tiçinde ssh), bu yüzden yardım edin.

Başka bir öneri de vipe(bir Vim komut borusu) kullanmak veya aşağıdaki basit komut dosyasını kullanmaktır:

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

İlişkili:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.