Vi'de bulunan i tarafından döndürülen tüm dosyaları Linux'ta nasıl düzenleyebilirim?


27

Kendimi çok bulurken bulduğum bir şey bir find komutu çalıştırıyor ve ardından hepsini vi'da düzenliyor, bu da şuna benziyor:

> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt

> vi ./file1.txt ./file2.txt ./path/to/file3.txt

Tüm bunları tek bir komut satırında yapmanın akıllıca ve basit bir yolu var mı?


1
Vi'ye bağlayabilirsiniz: bulun. "* .txt" | xargs vi
MaQleod

1
@MaQleod: Teknik olarak karşı boru olurdu Xargs .
yerçekimi


Borularımı xargsterminalden mahvettiğime boru döşiyorum . Uygun çözüm @DevSolar aşağıda biridir
typelogic

Yanıtlar:


41

Bu hile yapmak gerekir:

find . -name "*.txt" -exec vim {} + 

Vim kullanın, sağlığınız için daha iyi. :-)

Tüm dosya adlarının (satır uzunluğu sınırlarına kadar) tek bir satırda görünmesini sağlayan oft-overlooked +seçeneği -exec, yani tüm dosyaların bir vim oturumda açılmasını sağlar ( bir:n sonraki ve bir :Nönceki dosya için).

İle vim -psize her dosya için bir dosya sekmesini olsun. :help tab-page-commandsDaha fazla ayrıntı için kontrol edin .

Yanınızda vim -o, her dosya için yatay olarak bölünmüş pencereler, vim -Odikey olarak bölünmüş pencereler alırsınız . :help window-move-cursorDaha fazla ayrıntı için kontrol edin .

Bu cevabın önceki sürümünün, vim $(find . -name "*.txt")dosya adlarındaki boşluklarla çalışmadığını ve güvenlik etkileri olduğunu unutmayın.

Boru içine xargs via Warning: Input is not from a terminal, artı sonradan tamamen sahte davranış gösteren bir terminal verir . Kullanıcı ağırlığı, aşağıdaki yorumda neden olduğunu ve bu soruda biraz daha açıklamayı açıkladı .


4
Vim hakkında ne kadar şey bildiğinizi bilmiyorum, ama şunu bulmak beni / sonsuza dek sürdü: n bir sonraki dosyayı gösterir ve: N bir öncekini gösterir.
zpletan

4
@DevSolar: Vim, stdin'in kontrol terminali ile aynı olmasını bekler ve doğrudan stdin üzerinde terminal ile ilgili çeşitli ioctls'ler gerçekleştirir. (Bu bir hata düşünebiliriz Vim kesinlikle. Edebilirsiniz açmak /dev/ttyve bu konuda ioctl ();. Bunu yapmak sadece çok tembeldir) Xargs tarafından çağrıldığında vim alır /dev/nullsadece terminal kontrol IOCTL'ler görmezden standart girdi olarak.
yerçekimi

3
@zpletan: vim -pdosya sekmeleri istiyorsanız. ( gtVe gTgezinmek veya fare ile tıklayarak.)
grawity

2
FYI, borulara girerken uyarıları önlemek için vim, sadece -ilk argüman olarak belirtin echo foobar | vim -.
Konrad Rudolph

2
@Konrad Rudolph: find . -name "*.txt" | vim -Size bulunan dosyaların isimlerini içeren isimsiz bir dosya üzerinde bir vim seansı veriyor , ki bu OP'nin istediği gibi değil ...
DevSolar

4

Veya vim ve oradan çalıştırın:

:args **/*.txt

1

Ek olarak, bir defada açılmasını istiyorsanız, -exec komutunu veya döngü için basit bir komut da kullanabilirsiniz. Ceving'in yorumuna göre düzenlenmiştir.

find . -name "*.txt" -exec vi {} \;

veya

OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for i in `find . -name "*.txt"`
    do
        vi $i
    done
IFS=$OLDIFS

... ama neden bunu yapmak istiyorsun?
DevSolar

@DevSolar Birincisi bulma kabiliyetine işaret etmek, ikincisi genel amaçlı bir döngüdür. Belki de düzenlemeden önce her dosyaya bir şeyler yapmak istersin.
OldWolf

Hiç ikincisini denedin mi? İlk olarak: Bul -name, eksik olduğu için geçerli dizini döndürür . Ve ikincisi: Komut bir dosya adı boşluk içerdiği anda sefil bir şekilde başarısız olur. Kötü tavsiye edilen cevap için -1.
ceving

Aslında, dosya isimlerindeki boşlukların konusu benim cevabım için de geçerli. Bir komut satırından kendi küçük bir senaryosuna dönüştürmeden onları düzgünce kullanmanın bir yolunu bile düşünemiyorum. Dosya adlarındaki boşlukların önerilmemesi için iyi bir neden var.
DevSolar 16:11

@ceving Geçerli bir nokta. Orijinal posterlerin ihtiyaçları için geçerli olduğunu tahmin ettim. Düzenleme.
OldWolf

0

findKomutunuzu zaten yazdıysanız xargs, arama sonuçlarını açmak için kullanmanın çok daha kolay olabileceğini biliyorum :

find . -name "*.txt" | xargs vim -p

-pSeçenek yeni bir sekmede her dosyayı açmak için vim söyler. Bunu sadece tampon kullanmaktan daha uygun buluyorum, ama yapmazsan bu seçeneği bırak.


teşekkür ederim onu ​​bulmak için bağladım, bu yüzden benim komut oldu: bulmak dosya adı | xargs vim -p
talsibony 13:16

0

Tüm düzenlemek için *.txt, sadece çalıştırabilirsiniz: vim *.txt. Tarafından döndürülen dosyaları düzenlemek için find, daha fazlasını okuyun.


Unix / macOS'ta, findBSD ile kullanabilirsiniz xargs(bakınız :) man xargs, örneğin

find -L . -name "*.txt" -type f -print0 | xargs -o -0 vim

-o( xargs): Komutu çalıştırmadan önce stdin'i çocuk işleminde / dev / tty olarak yeniden açın.

İlgili: Terminal , Vim.SE'deki xargs ile Vim'i çağırdıktan sonra ağladı.

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.