ls를 grep으로 파이프합니다. grep이 ls 명령의 출력을 무시하는 이유는 무엇입니까?

ls를 grep으로 파이프합니다. grep이 ls 명령의 출력을 무시하는 이유는 무엇입니까?

나는 이 명령을 사용하여 ls -p | egrep "\<[A-Z]+\>"디렉토리 이름에 /가 추가된 모든 대문자 파일과 디렉토리 이름을 인쇄하려고 합니다. 파일/디렉터리 이름을 모두 대문자로 grep하도록 했는데도 내 명령이 작동하는 이유를 이해할 수 없습니다. 올바른 출력을 얻었지만 grep이 XXX/와 같은 디렉토리를 나열할 수 있는 방법을 이해하지 못합니다.

답변1

귀하의 질문은 " 대문자( )가 아닌 문자가 있어도 DIRNAME/확장 정규식과 일치하는 이유는 무엇입니까 ?"입니다.\<[A-Z]+\>/

귀하의 정규식은 다음을 포함하는 모든 항목과 일치합니다.단어모두 대문자:

$ printf '%s\n' "this is not matched" "this IS matched" | egrep "\<[A-Z]+\>"
this IS matched

너비가 0인 "단어 경계", 즉 "단어 문자"와 해당 유형이 아닌 문자(또는 줄의 시작/끝) 사이의 공백과 일치합니다 \<. \>단어 문자는 클래스의 모든 문자 [[:alpha:]_](문자 및 밑줄)입니다.

DIRNAME/귀하의 표현은 이후 와 일치하는 것과 일치합니다 ( DIRNAME앞 과 뒤에 D단어 경계가 있음 E).


디렉토리 목록에서 특정 이름을 필터링하려면 grep기타 줄 기반 텍스트 조작 도구를 사용하지 마십시오. 파일 이름에는 개행 문자가 포함될 수 있으므로 파일 이름에 제한을 두지 않는 한 줄 기반 도구는 올바른 작업을 수행하는 데 어려움을 겪습니다.

대신 디렉토리에서 모든 대문자 이름을 얻으려면 다음을 수행하십시오 bash.

$ ls -p -d *
DIR/     FILE     TEST123  dir/     file     test123
$ ls -p -d !(*[[:lower:]]*)
DIR/     FILE     TEST123

이를 위해서는 shopt -s extglob확장된 글로빙 모드를 활성화해야 합니다. 확장된 와일드카드 패턴은 !(*[[:lower:]]*)소문자가 포함되지 않은 모든 항목과 일치합니다.

/이 패턴은 디렉토리 이름에 무엇이 추가되는지 상관하지 않습니다 ls -p. 패턴이 파일 이름과 일치하고 문자가 포함된 파일 이름이 없기 때문입니다 /. 또한 스키마가 확장되었습니다.앞으로 ls호출됩니다.

숫자가 포함된 이름도 지우려면 다음을 사용하세요.

$ ls -p -d !(*[[:lower:][:digit:]]*)
DIR/  FILE

(소문자나 숫자가 하나 이상 포함된 이름은 포함되지 않습니다.) 또는,

$ ls -p -d !(*[[:lower:]]*|*[[:digit:]]*)
DIR/  FILE

(단, 소문자 1개 이상 포함된 이름이나 숫자 1개 이상 포함된 이름은 포함되지 않습니다.)

답변2

문법은 다음을 \>의미합니다.단어 끝에서 일치. 당신이 원하는 것은 아마도

ls | egrep "^[A-Z.]+$"

여기서는 ^줄의 시작과 일치하고 $줄의 끝과 일치합니다.

답변3

$  ls -p | egrep "[A-Z]+"
ABC
$  ls -p ???             
ABC  fif  out

나에게 있어 행동을 변화시킨 것은 단어 경계 일치였습니다.

ls -p | egrep "\<[A-Z]+\>"내 경우에는 출력이 제공되지 않습니다.

비교 ls -f |cat하고 ls -p |cat. 정규식을 수정하기 시작하면 다음과 같은 사실을 알게 될 것입니다. 사람들은 귀찮게 해서는 안 됩니다.이런 일: 결국 너무 복잡해서 이 작업을 수행하지 않는 것이 좋습니다.분석하다체계적으로 ls: ls 출력은 IE에서 작동하는 파일 목록이 아닌 단순한 "보고서"입니다. (같은스크린샷MS Windows의 탐색기 창과 거의 같습니다. )

$  ls -p |cat 
ABC
XYZ/

$  ls -f |cat 
XYZ
ABC

순서도 다르지만 /디렉터리를 필터링하는 데 슬래시를 사용하면 안 됩니다.

이와 같은 것이 필요하며 find . -type d(모든 하위 디렉토리에도 디렉토리만 나열) 파일 시스템 검색을 위한 좋은 시작점이 있습니다.

$  find . -type d 
.
./XYZ
./d3
./d3/d2
./d3/d1
./d2
./d1

귀하의 사양은 간단한 ls (아마도 grep 트릭을 사용함)와 깨끗한 솔루션 사이에 있습니다 find. 나는 그 중 어느 것도 제공하지 않을 것입니다. 모든 것은 "원시" 파일 시스템 정보 나열에 관한 귀하의 성격과 향후 계획에 달려 있습니다.

이는 차이점을 보여줍니다.

 $  find . -name "d1"
./d3/d1
./d1

$  ls -R |grep d1
d1
./d1:
d1
./d3/d1:

ls-grep을 사용하면 "추가" 줄과 문자를 얻을 수 있습니다. 필사적으로 쉘에서 상호 작용하십시오. 왜 안되겠습니까? (파일 "d1"이어딘가에)

그러나 스크립트로 작성된 모든 내용은 의존해야 하며 find거기에는 많은 가능성이 있습니다. 파일 시스템을 데이터베이스로 전환합니다: 쿼리 및 보고: 두 단계. ls명령줄의 빠른 올인원 도구입니다.

$ ls -p -d !(*[[:lower:]]*|*[[:digit:]]*)

정말 심각한가요? 그 외에도 전략적인 조언은 어떻습니까? 댓글 등을 참조하세요.

아, 그리고 모든 사용자가 상상할 수 있는 모든 라이너에 참여하고 싶을 수도 있습니다. 그래서바로크. 난 그래뿌리스타일.


관련 정보