Tout d'abord, ce que vous essayez de faire, l| grep
est mauvais. Ne le faites pas. Voici pourquoi.
La commande l
est en réalité un alias de ls -CF
$ type -a l
l is aliased to `ls -CF'
Par défaut dans le bash
d'Ubuntu, ls
est un alias de ls --color=auto
. Comme l'a souligné steeldriver dans les commentaires, --color=auto
est censé désactiver la colorisation. Dans votre cas spécifique, vous avez alias ls="ls -alh --color"
et alias l="ls -CF"
, ce qui se traduit essentiellement par ls -alh --color -CF
. Cette combinaison particulière d'options envoie toujours une sortie colorisée dans un pipe. 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.
Que signifie tout cela
Cela signifie que l
affichera une liste colorisée des fichiers selon leur type. Le problème est que la colorisation se fait avec l'utilisation de séquences d'échappement. C'est ce que sont ces choses en 1:34m
- ce sont des séquences d'échappement pour des couleurs spécifiques.
Le problème principal est que l'analyse de ls
conduit souvent à des sorties incorrectes et à des désastres dans les scripts, simplement parce que ls
permet des séquences d'échappement comme expliqué précédemment et d'autres caractères spéciaux. Consultez cet article pour plus d'informations: http://mywiki.wooledge.org/ParsingLs
Ce que vous devriez faire:
Utilisez la commande find
:
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Vous pourriez faire quelque chose comme ceci avec un glob de shell 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 des noms de fichiers que le bash
seul
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 ls
peut également faire l'affaire. (Rappelez-vous, cela ne sert qu'à visualiser la liste des fichiers, pas à la passer à un autre programme pour traiter le texte de sortie)
bash-4.3$ ls *1*
1.txt