Her şeyden önce, yapmaya çalıştığınız l| grep <filename>
şey kötü. Yapma. İşte nedeni.
l
komut gerçekten bir takma addır ls -CF
$ type -a l
l is aliased to `ls -CF'
Ubuntu en Varsayılan olarak bash
, ls
bir diğer adıdır ls --color=auto
. Steeldriver'ın belirttiği gibi --color=auto
, renklendirmeyi kapatması gerekiyor. Belirli bir durumda, sahip alias ls="ls -alh --color"
ve alias l="ls -CF"
temelde varlık biter, hangi ls -alh --color -CF
. Bu anahtar kombinasyonu hala bir boru üzerinden renklendirilmiş çıktı gönderir. Örneğin:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
.
Ve ..
dizinlerinin nasıl aynı kaçış dizisine sahip olduğuna dikkat edin .
Bütün bunlar ne anlama geliyor?
Bu l
, dosya türüne göre renklendirilmiş dosya listesi çıkacağı anlamına gelir . Sorun şu ki renklendirme kaçış dizilerinin kullanımıyla gerçekleşiyor . En neyi Yani 1:34m
şeylerdir - bunlar belirli renkler için konum çıkış sırası.
Ana sorun, ayrıştırma işleminin ls
genellikle yanlış çıktıya ve komut dosyalarında felaketlere yol açmasıdır, çünkü ls
daha önce açıklandığı gibi kaçış dizilerine ve diğer özel karakterlere izin verir. Daha fazla bilgi için bu makaleye bakın: http://mywiki.wooledge.org/ParsingLs
Ne yapmalısınız?
find
Komutu kullan :
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Kabuk glob ve modern test [[
komutu ile böyle bir şey yapabilirsiniz :
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
Ya da bash
tek başına olduğundan çok daha iyi dosya adı işleme yeteneklerine sahip python kullanın
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
Çıktının işlenmesine gerek yoksa ls
, basit globbing ls
de işi yapabilir. (Unutmayın, bu yalnızca dosya listesini görüntülemek içindir, çıktı metni ile ilgilenmek için başka bir programa aktarmak için değildir)
bash-4.3$ ls *1*
1.txt