Bir ls komutunun sonucu olan tüm dosyaları nasıl açabilirim?


10

Bir metin düzenleyicisi kullanarak ls komutunun sonucu olan tüm metin dosyalarını açmak istiyorum. Bunu nasıl yaparım?

Yanıtlar:


12

Gilles tam doğru , lsgerçekten kötü bir örnek çünkü dosya adı glob genişletmesi kullanmak zorunda kalmadan komut satırında çok daha kolay yapılabilir ls! Sözde "metin dosyalarınız" bunları tanımlamak için dosya adı uzantılarına sahipse, şöyle bir şey yapabilirsiniz:

editor-command *.txt

Bir tekniği göstermek adına, sadece bir dosya adı eşleşmesi ile yapılamayan daha karmaşık bir örnek kullanalım ve sadece dosya adı yerine içeriğe dayalı olarak dosyaları açalım. Diyelim ki "content-type" dizesini içeren tüm dosyaları açmak istiyorsunuz.

Editörünüzün birden fazla dosya adını kabul edeceğini ve hepsini bir defada ayrı arabelleklerde açacağını veya sırayla bunların içinden geçeceğini varsayarsak, şunları yapabilirsiniz:

editor-command $(grep -i content-type)

Şimdi orijinal sorunuza geri dönelim, adlarına göre metin dosyası olup olmadıklarını bilmediğinizi varsayalım. Daha sonra bunları tanımlamak için başka bir program kullanmanız ve ardından bu verilere dayanarak açmanız gerekir. Program filesize bir şeyin ne tür bir dosya olduğunu söyleyecektir ve bu listeyi sadece metin dosyaları için grep ve daha sonra sadece bunun gibi eşleşen dosya adlarını açabilirsiniz:

editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)

Komut zincirinin $()yapı içindeki çıktısı editör için argüman olarak kullanılacaktır. Bunu bazen iki aşamada yapıyorum. Diyelim ki bazı dosyaları inceliyorum ve kendime "içerik türü" dizesini içeren her xml dosyasının bir listesini alıyorum

find -type f -iname '*xml' | xargs grep -Hi 'content-type' |  cut -d: -f1

... ve onları açmak istediğime karar verdim. Daha sonra son komut geçmişi kısayolunu kullanın ve bunu yapın:

vim $(!!)

... bir önceki komutun tüm sonuçlarını favori düzenleyicim vim'de açmak için.

Düzenleyiciniz her seferinde yalnızca bir dosyayı kabul edecekse ve spawing editörlerini tutmanız gerekiyorsa, stdio'ya ihtiyaç duyan terminal tabanlı bir düzenleyici kullanıp kullanmadığınıza bağlı olarak jmtd'in cevabındaxargs veya fordöngüsünün bir varyantını kullanmanız gerekecektir .



@Gilles: Usulüne göre, hepimizin göremediği aşikar olduğuna dikkat çektiğiniz için teşekkürler. @ c0smikdebris Hangi dosyaları yalnızca isimleriyle metin eşleştirmenin açık bir yoluna sahip değilseniz, cevabımı da içeren cevabımı tamamen yeniden yazdığımı unutmayın.
Caleb

$ () aslında aradığım şeydi. Burada örnek olarak ls kullandığımdan bahsetmeliydim. Her iki yanıta +1.
c0smikdebris

"en sevdiğim editör". Belirtmeye gerek yok, @Caleb, cevabın başlangıcından itibaren aşağı yukarı açık olduğu için, ahahah! Şimdiye kadarki en iyi editör!
Enrico Maria De Angelis

4

Geçerli dizinde bir şey .txt(ie *.txt) adı verilen tüm dosyaları açmak için :

$EDITOR *.txt

nerede $EDITORfavori editörü, örneğin gedit *.txt, nano *.txt, vim *.txt, emacs *.txtya da her neyse. *Geçerli dizindeki tüm dosyaları eşleştirmek için kullanın .

lsKomutun dahil olmadığını unutmayın . İşinin lsgerçekten bir dosya listesi görüntülemesine rağmen, bir dizine çağırdığınızda gerçekleşir. Nerede lsyararlıdır dosya özelliklerini (modifikasyon süresi, izinler, vb büyüklüğü ve) görüntüleme içindedir. Belirli bir joker desenle eşleşen bir grup dosyada bir şeyler yapmak için kabuğun globları yeterlidir.

Yeterince gelişmiş editörler bunu içeriden yapmanızı sağlar. Örneğin, Emacs'ta normal dosya açma komutunu ( C-x C-f) kullanın ve girin *.txt.

Alt dizinlerdeki dosyaları da zsh veya bash ≥4 ile eşleştirmek istiyorsanız, kullanabilirsiniz $EDITOR **/*.txt.


Bu gerçekten editöre özgüdür. Tüm düzenleyicilerin tüm ücretsiz komut satırı argümanlarını açılacak dosyalar olarak ele alacağının veya aynı anda birden fazla dosyanın açılmasını destekleyeceğinin garantisi yoktur.
jmtd

2

Metin düzenleyicinizin bazı nüanslarına bağlıdır. Gelişmiş editörler muhtemelen bir kerede komut satırından birden fazla dosya açmayı işleyebilir. Ancak, örneğin, düzenleyicinizin (aşağıdaki örneklerimdeki $ EDITOR) her seferinde yalnızca bir tane açabileceğini varsayalım. Sen boru bir uygun çıktısını gerektiği findiçine xargs. Bu aynı zamanda $ EDITOR'un TTY'yi devralmamasına da bağlıdır (yani, grafiksel bir tane kullanarak)

find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR

Bir konsol düzenleyicisi kullanmak istiyorsanız, bir kabuk döngüsü daha uygun olabilir, ancak nadir görülen birçok dosya adı için başarısız olursa (boşluk karakterlerini ve diğer çeşitli şeyleri daraltarak veya değiştirerek):

for i in *.c; do $EDITOR "$i"; done

2
Ls çıktısını ayrıştırmayın! $EDITOR *.cVeya tuşunu kullanın for i in *.c; do $EDITOR "$i"; done.
Gilles 'SO- kötü olmayı bırak'

İyi yakalama - uygun şekilde düzenlenmiştir.
jmtd

Büyük for/ küçük harflerin daraltılması / boşluk karakterlerinin değiştirilmesi dahil olmak üzere birçok dosya adı için başarısız olacağını unutmayın .
jmtd

Şimdi yazıldığı gibi, forvaka her dosya adıyla çalışacaktır ( bazı editörlerle başlayan -veya +bazı editörlerle başlayan adlar hariç ; for i in ./*.cbunu düzeltir).
Gilles 'SO- kötü olmayı bırak'
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.