“ls -a | grep ^ \.”


10

나는 pwd의 내용을 나열하고 dot로 시작하는 파일 만 표시하고 싶었습니다. 시도 ls -a | grep ^\.했지만 출력에 점으로 시작하지 않는 파일도 왜 포함되어 있는지 알 수 없습니다. 예를 들면 다음과 같습니다.

Pictures
.pip
.pki
.profile
projects
Public

나는 내가 원하는 것을 달성 할 수 있다는 것을 알고있다. 나는 ls -ld .*설명 할 수없는이 grep의 행동에 대해 궁금하다.



ls -d .*시작하는 모든 파일을 나열하는 것이 .어떻습니까?
Barmar

주의 사항 : ls의 출력을 다른 명령으로 파이프하지 마십시오. 대신 찾기를 사용하십시오. ls는 너무 많은 아이디어 동기화를 신뢰할 수 없습니다. 참조 : mywiki.wooledge.org/BashPitfalls의 함정 1-1 위! 나머지 사이트도 훌륭합니다.
Joe

답변:


20

인수를하는 견적 grep따라서,ls -a | grep '^\.'

그 이유는 쉘 핸들이다 \.교대가 일반에 백업 ., 이는 grep다음 단일 문자 와일드 카드로 취급합니다. 의심스러운 경우, 항상 쉘에 특수한 문자를 포함하거나 포함 할 수있는 문자열을 인용하십시오.


왜 쉘은 \를 무시합니까?
ps-aux

\는 쉘이 다음 문자를 리터럴 문자로 취급하도록하는 이스케이프 시퀀스입니다. 여기서 grep ^\\.\\는 쉘에 의해 단일 백 슬래시로 취급되고 grep은 단일 백 슬래시 다음에 점을 리터럴 도트로 취급합니다.
Avinash Raj

11

grep 정규식을 따옴표 안에 넣어야합니다.

ls -a | grep '^\.'

참고 : command 출력을 구문 분석하지 마십시오ls .


ls 출력을 구문 분석하는 것이 왜 나쁜가요?
ps-aux

링크에서 : 기본 모드에서 표준 출력이 터미널이 아닌 경우 ls는 파일 이름을 줄 바꿈으로 구분합니다. 이름에 줄 바꿈이있는 파일이 생길 때까지 괜찮습니다.
Michael Durrant

@ Michael Durrant : 파일 이름에 줄 바꿈을 허용하는 것이 시스템의 주요 버그라고 제안합니다.
jamesqf

@jamesqf - 참조 파일 이름에 줄 바꿈 (특히 SML 의 대답을).
don_crissti

0

cmd ls -a | grep ^ \. grep은 "\"를 "."의 특수 문자 및 의미로 간주하지 않습니다. 탈출하지 마십시오.

cmd ls -a | grep "^ \." grep은 "\"를 "."의 특수 문자 및 의미로 간주합니다. 탈출. 예상대로 결과를 제공합니다.

따옴표없이 grep cmd를 사용하려면 "\"문자도 이스케이프해야합니다. 다음 명령으로 큰 따옴표없이 결과를 기대할 수 있습니다. LS -a | grep ^ \\.

Regex에서 특수 문자의 의미에 대한 자세한 내용은 다음 링크를 참조하십시오. http://www.regular-expressions.info/quickstart.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.