우선, 당신이하려는 일 l| grep <filename>이 나쁩니다. 하지마 이유는 다음과 같습니다.
l 명령은 실제로 별칭입니다 ls -CF
$ type -a l
l is aliased to `ls -CF'
우분투에서 기본적으로 bash, ls별칭입니다 ls --color=auto. 의견에서 지적한 스틸 드라이버는 채색 --color=auto을 해제해야합니다. 특정 경우에는 기본적으로 alias ls="ls -alh --color"and 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
또는 bash혼자서 보다 파일 이름 처리 기능이 훨씬 뛰어난 파이썬을 사용하십시오.
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
의 출력을 처리 할 필요가 없으면 ls간단한 globbing으로 ls도 작업을 수행 할 수 있습니다. (이것은 출력 텍스트를 다루기 위해 다른 프로그램으로 전달하는 것이 아니라 파일 목록을보기위한 것입니다)
bash-4.3$ ls *1*
1.txt