首先,您要尝试做的事l| grep <filename>很糟糕。不要这样 这就是为什么。
l 命令实际上是 ls -CF
$ type -a l
l is aliased to `ls -CF'
在Ubuntu的默认情况下bash,ls是的别名ls --color=auto。正如钢手在评论中指出的,--color=auto应该关闭着色。在您的具体情况下,您有alias ls="ls -alh --color"and alias l="ls -CF",基本上就是ls -alh --color -CF。开关的这种特定组合仍然通过管道发送彩色输出。例如:
$ ls -alh --color -CF ~/TESTDIR | cat -A                                                                                 
^[[0m^[[01;34m.^[[0m/  ^[[01;34m..^[[0m/  1.txt  2.txt  3.txt  out.txt$
注意.和..目录如何具有相同的转义序列。
这是什么意思呢
这意味着l将根据文件类型输出彩色的文件列表。问题是着色是通过使用转义序列发生的。就是这样1:34m-它们是特定颜色的转义序列。
主要问题在于,解析ls通常会导致脚本输出错误和灾难,原因仅仅是因为ls允许使用转义序列(如先前所述)和其他特殊字符。有关更多信息,请参见本文:http : //mywiki.wooledge.org/ParsingLs
您应该做什么:
使用find命令:
bash-4.3$ ls
1.txt  2.txt  3.txt  out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
您可以使用shell glob和现代测试[[命令执行以下操作:
bash-4.3$ for file in * ;do if [[ "$file" =~ "1"  ]] ;then echo "$file" ;fi ; done
1.txt
或者也许使用python,它的文件名处理能力比bash单独的要好得多
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
如果不需要处理的输出,则只需进行ls简单的globing ls即可完成这项工作。(请记住,这仅用于查看文件列表,而不用于将其传递到另一个程序来处理输出文本)
bash-4.3$ ls *1*
1.txt