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
, ls
jest aliasem ls --color=auto
. Jak zauważył Steeldriver w komentarzach, --color=auto
ma 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 l
wyś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:34m
są rzeczy - są sekwencjami ucieczki dla określonych kolorów.
Główny problem polega na tym, że parsowanie ls
często prowadzi do złych wyników i katastrof w skryptach, po prostu dlatego, że ls
umoż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 find
polecenia:
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ż bash
sam
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ą ls
moż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