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, lsbir 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 lsgenellikle yanlış çıktıya ve komut dosyalarında felaketlere yol açmasıdır, çünkü lsdaha ö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?
findKomutu 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 bashtek 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 lsde 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