En primer lugar, lo que intentas hacer l| grep <filename>es malo. No lo hagas Este es el por qué.
l comando es realmente un alias para ls -CF
$ type -a l
l is aliased to `ls -CF'
Por defecto en Ubuntu bash, lses un alias para ls --color=auto. Como Steeldriver señaló en los comentarios, --color=autose supone que apaga la coloración. En su caso específico, tiene alias ls="ls -alh --color"y alias l="ls -CF", que básicamente termina siendo ls -alh --color -CF. Esta combinación particular de interruptores aún envía salidas coloreadas a través de una tubería. Por ejemplo:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
Observe cómo los directorios .y ..tienen las mismas secuencias de escape.
Qué significa todo esto
Esto significa que lgenerará una lista coloreada de archivos según el tipo de archivo. El problema es que la coloración ocurre con el uso de secuencias de escape . Eso es lo 1:34mque son las cosas: son secuencias de escape para colores específicos.
El problema principal es que el análisis a lsmenudo conduce a resultados incorrectos y desastres en los scripts, simplemente porque lspermite secuencias de escape como se explicó anteriormente y otros caracteres especiales. Consulte este artículo para obtener más información: http://mywiki.wooledge.org/ParsingLs
Lo que deberías estar haciendo:
Use el findcomando:
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Podría hacer algo como esto con shell glob y el [[comando de prueba moderno :
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
O tal vez use python, que tiene capacidades de manejo de nombre de archivo mucho mejores que bashsolo
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
Si no hay necesidad de procesar la salida ls, también lspuede hacer el trabajo de forma simple . (Recuerde, esto es solo para ver la lista de archivos, no para pasarlo a otro programa para tratar el texto de salida)
bash-4.3$ ls *1*
1.txt