Prima di tutto, quello che stai cercando di fare l| grep <filename>è male. Non farlo Ecco perché.
l il comando è davvero un alias di ls -CF
$ type -a l
l is aliased to `ls -CF'
Di default in Ubuntu bash, lsè un alias di ls --color=auto. Come ha sottolineato steeldriver nei commenti, --color=autosi suppone di disattivare la colorazione. Nel tuo caso specifico, hai alias ls="ls -alh --color"e alias l="ls -CF", che sostanzialmente finisce per essere ls -alh --color -CF. Questa particolare combinazione di interruttori invia ancora output colorato su un tubo. Per esempio:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
Notare come le directory .e ..abbiano le stesse sequenze di escape.
Che cosa significa tutto questo
Ciò significa che lverrà visualizzato un elenco di file colorato in base al tipo di file. Il problema è che la colorazione avviene con l'uso di sequenze di escape . Ecco cosa 1:34msono: sono la sequenza di escape per colori specifici.
Il problema principale è che l'analisi lsspesso porta a output errati e disastri negli script, semplicemente perché lsconsente sequenze di escape come spiegato in precedenza e altri caratteri speciali. Vedi questo articolo per maggiori informazioni: http://mywiki.wooledge.org/ParsingLs
Cosa dovresti fare:
Usa il findcomando:
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Potresti fare qualcosa del genere con shell glob e moderno [[comando di test :
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
O forse usa python, che ha capacità di gestione dei nomi dei file molto migliori rispetto al bashsolo
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
Se non è necessario elaborare l'output di ls, anche il semplice globbing lspuò fare il lavoro. (Ricorda, questo è solo per visualizzare l'elenco di file, non per passarlo a un altro programma per gestire il testo di output)
bash-4.3$ ls *1*
1.txt