首先,您要尝试做的事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