Перш за все, те, що ви намагаєтеся зробити, 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