Po pierwsze, to, co próbujesz zrobić, l| grep <filename>jest złe. Nie rób tego Dlatego.
l polecenie jest naprawdę pseudonimem ls -CF
$ type -a l
l is aliased to `ls -CF'
Domyślnie w Ubuntu bash, lsjest aliasem ls --color=auto. Jak zauważył Steeldriver w komentarzach, --color=automa wyłączać kolorowanie. W twoim konkretnym przypadku masz alias ls="ls -alh --color"i alias l="ls -CF", co w gruncie rzeczy kończy się ls -alh --color -CF. Ta szczególna kombinacja przełączników nadal wysyła kolorowe wyjście przez potok. Na przykład:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
Zauważ, że katalogi .i ..mają takie same sekwencje specjalne.
Co to wszystko znaczy
Oznacza to, że lwyświetli pokolorowaną listę plików według typu pliku. Problem polega na tym, że koloryzacja zachodzi przy użyciu sekwencji ucieczki . Właśnie takie 1:34msą rzeczy - są sekwencjami ucieczki dla określonych kolorów.
Główny problem polega na tym, że parsowanie lsczęsto prowadzi do złych wyników i katastrof w skryptach, po prostu dlatego, że lsumożliwia sekwencje specjalne, jak wyjaśniono wcześniej, i inne znaki specjalne. Zobacz ten artykuł, aby uzyskać więcej informacji: http://mywiki.wooledge.org/ParsingLs
Co powinieneś robić:
Użyj findpolecenia:
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Możesz zrobić coś takiego z globem powłoki i nowoczesnym [[poleceniem testowym :
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
A może użyj Pythona, który ma znacznie lepsze możliwości obsługi nazw plików niż bashsam
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
Jeśli nie ma potrzeby przetwarzania wyniku ls, proste globowanie za pomocą lsmoże również wykonać pracę. (Pamiętaj, że służy to tylko do przeglądania listy plików, a nie do przekazywania jej do innego programu w celu obsługi tekstu wyjściowego)
bash-4.3$ ls *1*
1.txt