Primeiro de tudo, o que você está tentando fazer l| grep <filename>
é ruim. Não faça isso. Aqui está o porquê.
l
comando é realmente um alias para ls -CF
$ type -a l
l is aliased to `ls -CF'
Por padrão no Ubuntu bash
, ls
é um apelido para ls --color=auto
. Como a chave de aço apontada nos comentários --color=auto
deve 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 sobre um tubo. 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 seqüências de escape.
O que tudo isso 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 as 1:34m
coisas são - elas são uma sequência de escape para cores específicas.
O principal problema é que a análise ls
geralmente leva a resultados e desastres errados nos scripts, simplesmente porque ls
permite seqüências de escape como explicadas anteriormente e outros caracteres especiais. Consulte este artigo para obter mais informações: http://mywiki.wooledge.org/ParsingLs
O que você deve fazer:
Use o find
comando:
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 [[
comando de teste moderno :
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
Ou talvez use python, que possui recursos de manipulação de nome de arquivo 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 ls
, o simples globbing também ls
pode fazer o trabalho. (Lembre-se, isso é apenas para visualizar a lista de arquivos, não para transmiti-la para outro programa para lidar com o texto de saída)
bash-4.3$ ls *1*
1.txt