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
, ls
es un alias para ls --color=auto
. Como Steeldriver señaló en los comentarios, --color=auto
se 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 l
generará 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:34m
que son las cosas: son secuencias de escape para colores específicos.
El problema principal es que el análisis a ls
menudo conduce a resultados incorrectos y desastres en los scripts, simplemente porque ls
permite 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 find
comando:
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 bash
solo
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 ls
puede 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