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
, ls
est un alias de ls --color=auto
. Comme l'a souligné Steeldriver dans les commentaires, il --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 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 l
la 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:34m
choses sont - ce sont des séquences d'échappement pour des couleurs spécifiques.
Le problème principal est que l'analyse syntaxique ls
conduit souvent à une sortie incorrecte 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. Voir cet article pour plus d'informations: http://mywiki.wooledge.org/ParsingLs
Ce que vous devez faire:
Utilisez la find
commande:
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 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 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