우선, 당신이하려는 일 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