Primeiro de tudo, o que você está tentando fazer, l| grep <filename>
é ruim. Não faça isso. Aqui está o porquê.
l
é realmente um alias para ls -CF
$ type -a l
l is aliased to 'ls -CF'
Por padrão, no bash
do Ubuntu, ls
é um alias para ls --color=auto
. Como o Steeldriver apontou nos comentários, --color=auto
deveria desativar a colorização. No seu caso específico, você tem alias ls="ls -alh --color"
e alias l="ls -CF"
, que basicamente acaba sendo ls -alh --color -CF
. Essa combinação específica de switches ainda envia saída colorida em um pipe. Por exemplo:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
Observe como os diretórios .
e ..
têm as mesmas sequências de escape.
O que isso tudo significa
Isso significa que l
produzirá uma lista colorida de arquivos de acordo com o tipo de arquivo. O problema é que a colorização acontece com o uso de seqüências de escape . Isso é o que são 1:34m
coisas - eles são seqüência de escape para cores específicas.
O principal problema é que a análise de ls
geralmente leva a resultados e desastres errados em scripts, simplesmente porque ls
permite sequências de escape, como explicado anteriormente, e outros caracteres especiais. Veja este artigo para mais informações: link
O que você deveria fazer:
Use o comando find
:
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Você poderia fazer algo assim com o shell glob e o teste moderno [[
command:
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
Ou talvez use o python, que tem recursos de manuseio de arquivos muito melhores do que bash
sozinho
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
Se não houver necessidade de processar a saída de ls
, a simples globbing com ls
também poderá funcionar. (Lembre-se, isso é apenas para visualizar a lista de arquivos, não para passá-lo para outro programa para lidar com o texto de saída)
bash-4.3$ ls *1*
1.txt