如图所示,我使用l
获取当前文件夹中的文件。然后我想获取编号为 的文件1
,因此我使用pipe
和grep
。
但为什么会出现2
和22
文件? 还有 是什么1;34m
?
$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22
更新
我已经l
在我的文件中为该命令添加了别名zshrc
。
alias lsp="ls"
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias ls="ls -alh --color"
该命令的结果如下type
:
>$ type ls
ls is an alias for ls -alh --color
> $ type l
l is an alias for ls -CF
答案1
首先,你正在尝试做的事l| grep <filename>
是错误的。不要这么做。原因如下。
l
命令实际上是ls -CF
$ type -a l
l is aliased to `ls -CF'
默认情况下,在 Ubuntu 的 中bash
,ls
是 的别名ls --color=auto
。正如steeldriver 在评论中指出的那样,--color=auto
应该关闭着色。在您的特定情况下,您有alias ls="ls -alh --color"
和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
bash
或者也许使用 python,它的文件名处理能力比单独使用要好得多
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
如果不需要处理 的输出ls
,简单的通配符ls
也可以完成工作。(请记住,这仅用于查看文件列表,而不是将其传递给另一个程序来处理输出文本)
bash-4.3$ ls *1*
1.txt
答案2
答案3
在您的试验中,您调用了ls
别名,因此1;34m
会产生来自着色的类似噪音,由于管道|
在同一行上接收所有这些,因此会从该行grep
匹配文件1
并因此打印该行。这就是您在屏幕上看到的内容。
当你做类似的事情时,最好返回到系统命令,每行显示 1 个结果。
要摆脱别名,只需输入\ls
,然后使用选项-1
以换行符分隔打印结果。
$ \ls -1 | grep "1"
1
11
注意:反斜杠方法适用于每个命令,\command
只调用未别名的系统命令。