Tout d'abord, ce que vous essayez de faire l| grep <filename>est mauvais. Ne le fais pas. Voici pourquoi.
l la commande est vraiment un alias pour ls -CF
$ type -a l
l is aliased to `ls -CF'
Par défaut dans Ubuntu bash, lsest un alias de ls --color=auto. Comme l'a souligné Steeldriver dans les commentaires, il --color=autoest censé désactiver la colorisation. Dans votre cas spécifique, vous avez alias ls="ls -alh --color"et alias l="ls -CF", ce qui finit par être ls -alh --color -CF. Cette combinaison particulière de commutateurs envoie toujours une sortie colorisée sur un tuyau. Par exemple:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
Remarquez comment les répertoires .et ..ont les mêmes séquences d'échappement.
Qu'est-ce-que tout cela veut dire
Cela signifie que lla liste colorisée des fichiers sortira en fonction du type de fichier. Le problème est que la colorisation se produit avec l'utilisation de séquences d'échappement . C'est ce que les 1:34mchoses sont - ce sont des séquences d'échappement pour des couleurs spécifiques.
Le problème principal est que l'analyse syntaxique lsconduit souvent à une sortie incorrecte et à des désastres dans les scripts, simplement parce que lspermet des séquences d'échappement comme expliqué précédemment et d'autres caractères spéciaux. Voir cet article pour plus d'informations: http://mywiki.wooledge.org/ParsingLs
Ce que vous devez faire:
Utilisez la findcommande:
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Vous pouvez faire quelque chose comme ça avec shell glob et la [[commande de test moderne :
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
Ou peut-être utiliser python, qui a de bien meilleures capacités de gestion de nom de fichier que bashseul
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
S'il n'est pas nécessaire de traiter la sortie de ls, un simple globbing avec lspeut également faire le travail. (Rappelez-vous, c'est uniquement pour afficher la liste des fichiers, pas pour la passer à un autre programme pour gérer le texte de sortie)
bash-4.3$ ls *1*
1.txt