Перш за все, те, що ви намагаєтеся зробити, 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
Ви можете зробити щось подібне за допомогою оболонки 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