Bir metin düzenleyicisi kullanarak ls komutunun sonucu olan tüm metin dosyalarını açmak istiyorum. Bunu nasıl yaparım?
Bir metin düzenleyicisi kullanarak ls komutunun sonucu olan tüm metin dosyalarını açmak istiyorum. Bunu nasıl yaparım?
Yanıtlar:
Gilles tam doğru , ls
gerç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 file
size 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 for
döngüsünün bir varyantını kullanmanız gerekecektir .
Geçerli dizinde bir şey .txt
(ie *.txt
) adı verilen tüm dosyaları açmak için :
$EDITOR *.txt
nerede $EDITOR
favori editörü, örneğin gedit *.txt
, nano *.txt
, vim *.txt
, emacs *.txt
ya da her neyse. *
Geçerli dizindeki tüm dosyaları eşleştirmek için kullanın .
ls
Komutun dahil olmadığını unutmayın . İşinin ls
gerçekten bir dosya listesi görüntülemesine rağmen, bir dizine çağırdığınızda gerçekleşir. Nerede ls
yararlı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
.
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 find
iç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
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 .
for
vaka her dosya adıyla çalışacaktır ( bazı editörlerle başlayan -
veya +
bazı editörlerle başlayan adlar hariç ; for i in ./*.c
bunu düzeltir).
editor-command *.css
, vb.