Во-первых, то, что вы пытаетесь сделать, 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"
и 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
будет выведен цветной список файлов в соответствии с типом файла. Проблема в том, что раскрашивание происходит с использованием escape-последовательностей . Это то, 1:34m
что есть - это escape-последовательность для определенных цветов.
Основная проблема заключается в том, что синтаксический анализ ls
часто приводит к неправильным выводам и сбоям в сценариях просто потому, что ls
допускает escape-последовательности, подобные описанным ранее, и другие специальные символы. См. Эту статью для получения дополнительной информации: 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
, то ls
можно выполнить и простое переключение с помощью. (Помните, это только для просмотра списка файлов, а не для передачи его другой программе для обработки выходного текста)
bash-4.3$ ls *1*
1.txt